如何将逗号分隔的字符串转换为列表?

在Java中是否有任何内置的方法允许我们将逗号分隔的字符串转换为一些容器(例如数组,列表或向量)?或者我需要为此编写自定义代码吗?

String commaSeparated = "item1 , item2 , item3";
List<String> items = //method that converts above string into list??
1179016 次浏览

两个步骤:

  1. # EYZ0
  2. # EYZ0

你可以结合asList和split

Arrays.asList(CommaSeparated.split("\\s*,\\s*"))

转换逗号分隔的字符串到列表

List<String> items = Arrays.asList(str.split("\\s*,\\s*"));

上面的代码在定义为:zero or more whitespace, a literal comma, zero or more whitespace的分隔符上分割字符串,将单词放入列表中,并折叠单词和逗号之间的空白。


请注意,这只是返回一个数组的包装器:例如,从结果的List返回.remove()。对于实际的ArrayList,您必须进一步使用new ArrayList<String>

您可以首先使用String.split(",")将它们分开,然后使用Arrays.asList(array)将返回的字符串array转换为ArrayList

List<String> items = Arrays.asList(commaSeparated.split(","));

这应该对你有用。

Arrays.asList返回由数组支持的固定大小的List。如果你想要一个普通的可变的java.util.ArrayList,你需要这样做:

List<String> list = new ArrayList<String>(Arrays.asList(string.split(" , ")));

或者,使用番石榴:

List<String> list = Lists.newArrayList(Splitter.on(" , ").split(string));

使用Splitter可以更灵活地分割字符串,例如,可以跳过结果中的空字符串和修剪结果。它也没有String.split那么奇怪的行为,并且不需要你按regex分割(这只是一个选项)。

没有内置的方法,但你可以简单地使用split()方法。

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items =
new  ArrayList<String>(Arrays.asList(commaSeparated.split(",")));

在groovy中,你可以使用tokenize(Character Token)方法:

list = str.tokenize(',')

一个使用Collections的例子。

import java.util.Collections;
...
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = new ArrayList<>();
Collections.addAll(items, commaSeparated.split("\\s*,\\s*"));
...

下面是另一个转换CSV到ArrayList的例子:

String str="string,with,comma";
ArrayList aList= new ArrayList(Arrays.asList(str.split(",")));
for(int i=0;i<aList.size();i++)
{
System.out.println(" -->"+aList.get(i));
}

打印你

< p >, < br > >字符串 ——>与< br > ——>逗号< / p >

这段代码会有帮助,

String myStr = "item1,item2,item3";
List myList = Arrays.asList(myStr.split(","));
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));


// enter code here

如果List是OP所说的最终目标,那么已经被接受的答案仍然是最短和最好的。然而,我想使用Java 8流提供替代方案,如果它是用于进一步处理的管道的一部分,将为您提供更多的好处。

通过将.split函数(原生数组)的结果包装到流中,然后转换为列表。

List<String> list =
Stream.of("a,b,c".split(","))
.collect(Collectors.toList());

如果根据OP的标题将结果存储为ArrayList很重要,你可以使用不同的Collector方法:

ArrayList<String> list =
Stream.of("a,b,c".split(","))
.collect(Collectors.toCollection(ArrayList<String>::new));

或者使用RegEx解析api:

ArrayList<String> list =
Pattern.compile(",")
.splitAsStream("a,b,c")
.collect(Collectors.toCollection(ArrayList<String>::new));

请注意,您仍然可以考虑将list变量的类型保留为List<String>而不是ArrayList<String>List的通用接口看起来仍然与ArrayList实现非常相似。

就其本身而言,这些代码示例似乎并没有添加太多内容(除了更多的输入),但是如果您计划执行更多操作,就像这是关于将String转换为long列表的答案示例那样,流API允许将操作一个接一个地管道化,因此非常强大。

为了,你懂的,完整。

ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>();
String marray[]= mListmain.split(",");

String ->集合转换:(String -> String[] -> Collection)

//         java version 8


String str = "aa,bb,cc,dd,aa,ss,bb,ee,aa,zz,dd,ff,hh";


//          Collection,
//          Set , List,
//      HashSet , ArrayList ...
// (____________________________)
// ||                          ||
// \/                          \/
Collection<String> col = new HashSet<>(Stream.of(str.split(",")).collect(Collectors.toList()));

# EYZ0转换:

String[] se = col.toArray(new String[col.size()]);

# EYZ0转换:

String[] strArr = str.split(",");

和# EYZ0:

List<String> list = new LinkedList<>(col);

我通常使用预编译模式的列表。而且这也更通用一些,因为它可以考虑一些listToString表达式后面的括号。

private static final Pattern listAsString = Pattern.compile("^\\[?([^\\[\\]]*)\\]?$");


private List<String> getList(String value) {
Matcher matcher = listAsString.matcher((String) value);
if (matcher.matches()) {
String[] split = matcher.group(matcher.groupCount()).split("\\s*,\\s*");
return new ArrayList<>(Arrays.asList(split));
}
return Collections.emptyList();

将集合转换为字符串,逗号分隔在Java 8

listOfString对象包含["A","B","C","D"]个元素-

listOfString.stream().map(ele->"'"+ele+"'").collect(Collectors.joining(","))

输出为:- ' A ', ' B ', ' C ', ' D ' < / p >

和转换字符串数组到列表在Java 8

    String string[] ={"A","B","C","D"};
List<String> listOfString = Stream.of(string).collect(Collectors.toList());
List<String> items = Arrays.asList(s.split("[,\\s]+"));
List<String> items= Stream.of(commaSeparated.split(","))
.map(String::trim)
.collect(Collectors.toList());

您可以使用Guava分割字符串,并将其转换为ArrayList。这也适用于空字符串,并返回一个空列表。

import com.google.common.base.Splitter;
import com.google.common.collect.Lists;


String commaSeparated = "item1 , item2 , item3";


// Split string into list, trimming each item and removing empty items
ArrayList<String> list = Lists.newArrayList(Splitter.on(',').trimResults().omitEmptyStrings().splitToList(commaSeparated));
System.out.println(list);


list.add("another item");
System.out.println(list);

输出如下:

[item1, item2, item3]
[item1, item2, item3, another item]

你也可以不使用番石榴使用以下方法:

  public static List<String> getStringAsList(String input) {
if (input == null || input.trim().length() == 0) {
return Collections.emptyList();
}


final String separators = "[;:,-]";
var result =
Splitter.on(CharMatcher.anyOf(separators))
.trimResults()
.omitEmptyStrings()
.splitToList(input);


return result;
}

Java 8中使用流有许多方法来解决这个问题,但在我看来,以下一行是直接的:

String  commaSeparated = "item1 , item2 , item3";
List<String> result1 = Arrays.stream(commaSeparated.split(" , "))
.collect(Collectors.toList());
List<String> result2 = Stream.of(commaSeparated.split(" , "))
.collect(Collectors.toList());

你可以这样做。

这样就去掉了空白和用逗号分隔的地方,你不需要担心空白。

    String myString= "A, B, C, D";


//Remove whitespace and split by comma
List<String> finalString= Arrays.asList(myString.split("\\s*,\\s*"));


System.out.println(finalString);

使用Splitter类可以获得相同的结果。

var list = Splitter.on(",").splitToList(YourStringVariable)

(用kotlin写)

在Kotlin中,如果你的字符串列表像这样,你可以使用这行代码将字符串转换为数组列表

var str= "item1, item2, item3, item4"
var itemsList = str.split(", ")

虽然这个问题已经很老了,并且已经被回答了很多次,但没有一个答案能够处理以下所有情况:

  • # EYZ0→空字符串应该映射到空列表
  • # EYZ0→所有元素都应该被修剪,包括第一个和最后一个元素
  • # EYZ0→应该删除空元素

因此,我使用以下代码(使用org.apache.commons.lang3.StringUtils,例如https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.11):

StringUtils.isBlank(commaSeparatedEmailList) ?
Collections.emptyList() :
Stream.of(StringUtils.split(commaSeparatedEmailList, ','))
.map(String::trim)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toList());

使用简单的分割表达式有一个优点:不使用正则表达式,因此性能可能更高。commons-lang3库是轻量级的,非常常见。

注意,实现假设您没有包含逗号的列表元素(即"a, 'b,c', d"将被解析为["a", "'b", "c'", "d"],而不是["a", "b,c", "d"])。

在java中,可以这样做

String catalogue_id = "A, B, C";
List<String> catalogueIdList = Arrays.asList(catalogue_id.split(", [ ]*"));

Java 9引入了List.of():

String commaSeparated = "item1 , item2 , item3";
List<String> items = List.of(commaSeparated.split(" , "));

此方法将字符串转换为一个数组,并接受两个参数:要转换的字符串和分隔字符串中的值的字符。它转换它,然后返回转换后的数组。

private String[] convertStringToArray(String stringIn, String separators){
    

// separate string into list depending on separators
List<String> tempList = Arrays.asList(stringIn.split(separators));
    

// create a new pre-populated array based on the size of the list
String[] itemsArray = new String[tempList.size()];
    

// convert the list to an array
itemsArray = tempList.toArray(itemsArray);
    

return itemsArray;
}