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

653

在Java中是否有任何内置的方法可以将逗号分隔的字符串转换为某个容器(例如数组、列表或向量)?还是我需要编写自定义代码来实现?

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

如果您想解析CSV,请参见https://dev59.com/Y1HTa4cB1Zd3GeqPORBa。 - Raedwald
@Raedwald,但这不是OP所要求的。 - Crowie
3
假设您想要与问题标题中所述的 ArrayList 一样,那么只有 ColinD 的答案是正确的。ArrayList(可变)与 List 完全不同,后者可以仅仅是一个简单的固定列表。 - Fattie
@Fattie - 说得好,已经修复了 - https://dev59.com/Bms05IYBdhLWcg3wCNlG#34735419 - YoYo
1
Java 8 解决方案:https://dev59.com/Bms05IYBdhLWcg3wCNlG#46485179 - akhil_mittal
28个回答

1173

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

List<String> items = Arrays.asList(str.split("\\s*,\\s*"));
上面的代码使用的分隔符定义为:零个或多个空格、一个逗号、零个或多个空格,这会将单词放入列表中并折叠单词和逗号之间的任何空格。
请注意,这只是数组的包装器:您不能例如从结果的List中使用.remove()。要获得实际的ArrayList,您必须进一步使用new ArrayList<String>

43
@rosch 这是一个正则表达式(regex)。\s 匹配任何空白字符,* 表示该匹配零次或多次。因此 \s* 表示“匹配任意空白字符零次或多次”。我们在逗号之前和之后查找此模式。因此,该拆分将适用于诸如 "item1 , item2 , item3""item1,item2 ,item3" 等字符串。在Java中,您需要在字符串中转义反斜杠,因此您会得到 \\s* - andrewrjones
6
"[\\s,]+"将会在逗号分隔的标记内部空格上进行拆分,即使没有逗号存在,它也会把两个空格都视为定界符。"\\s*(,\\s*)+"仅会修剪逗号分隔的标记周围的空格,并忽略任何只包含空格或为空的字符串。 - theferrit32
3
顺便提一下:如果你期望在输入字符串为空的情况下得到一个空列表,那么这个方法不适合你的使用场景。你将会得到一个包含一个空字符串的元素的列表。 - Madis Pukkonen
2
@MadisPukkonen,你说得完全正确,但我尊重原帖作者,认为他可以自己添加这样的逻辑。 - AlexR
3
@AlexR,虽然我感谢你尊重原帖作者,但我建议你不要说这样的话。我知道有些人因为受到虚假的称赞而感到自责。这只是我的想法。 - user7192474
显示剩余4条评论

239

Arrays.asList 返回由数组支持的固定大小的 List。如果您想要一个普通可变的 java.util.ArrayList,您需要执行以下操作:

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

或者,使用Guava

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

使用Splitter可以更灵活地拆分字符串,并使您能够跳过结果中的空字符串并修剪结果。它还比String.split具有更少的奇怪行为,同时不需要您通过正则表达式进行划分(这只是其中一种选项)。


6
虽然我看到你提到了它,但我更喜欢使用 **Splitter.on(",").trimResults().split(string)**。谢谢,点赞。 - John B
13
感谢您指出Arrays.asList并不返回普通列表。如果您尝试向该列表添加或删除元素,将会得到UnsupportedOperationException异常。+1 - Alfredo Osorio
10
自Guava 15.0版本起,可以使用**Splitter.on(",").splitToList(string)**来拆分字符串,并且这样可以省略一些步骤。 - Kango_V
有没有办法在字符串中添加空值,就像我有这样的字符串:1,,3,4,5,在这里2是缺失/空的。当转换为列表时,2将被跳过。但我想把它加入为空值。 - A.Aleem11
这种实现方式以及其他类似的例子存在的问题是,虽然 Arrays.asList 提供了一个原生数组的包装器(避免了元素复制),但 new ArrayList(...) 将会进行逐个元素的复制。我们应该优先选择一种方法,允许将解析后的元素直接添加到目标集合中。 - YoYo
这是正确的答案。你可以在在线Java编译器上尝试。 https://www.compilejava.net/ - Asad Shakeel

84

两个步骤:

  1. String [] items = commaSeparated.split("\\s*,\\s*"); 将逗号分隔的字符串转换为字符串数组。
  2. List<String> container = Arrays.asList(items); 将字符串数组转换为列表。

1
一旦您将items变量内联,它基本上与其他答案相同,但实际上更有效率,因为它不使用正则表达式。但是,逗号周围的空格会破坏此选项。 - Amrinder Arora
5
split方法的参数被解释为正则表达式。 - Madbreaks

68
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(Collectors.toList());

2
现在是最好的答案之一。此答案中的列表可以进行修改 +1。 - SedJ601
3
collect(toList()) 改为 collect(Collectors.toList()) 后仍可正常工作。 - Sundararaj Govindasamy
2
实际上,collect(toList()) 是使用静态导入 Collectors.toList() 来简洁和流畅地编写代码 :) - Manu
这很神奇,因为它涵盖了空字符串和没有分隔符的单个字符串。 - Mahmoud Saleh
如果你有一个字符串像", whatever, ",它将在列表中添加两个空字符串成员,一个在开头,另一个在结尾。 - Pere
显示剩余3条评论

27
如果一个List是OP所述的终极目标,那么已经接受的答案仍然是最短和最好的。但是我想提供使用Java 8 Streams的替代方法,如果它是进一步处理的管道的一部分,那么这将给您带来更多的好处。
通过将.split函数(本机数组)的结果包装到流中,然后转换为列表。
List<String> list =
  Stream.of("a,b,c".split(","))
  .collect(Collectors.toList());

如果按照原帖标题中的要求需要将结果存储为ArrayList,您可以使用不同的Collector方法:
ArrayList<String> list = 
  Stream.of("a,b,c".split(","))
  .collect(Collectors.toCollection(ArrayList<String>::new));

或者使用正则表达式解析 API:

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

请注意,您仍然可以考虑将list变量保留为List<String>类型,而不是ArrayList<String>。泛型接口List看起来与ArrayList实现非常相似。
单独看这些代码示例似乎并没有增加太多内容(除了更多的输入),但如果您计划执行更多操作,比如this answer on converting a String to a List of Longs所示,流API非常强大,允许您将操作串联在一起。
为了完整起见。

24

这里有另外一种将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));
}

打印你

-->字符串
-->带有
-->逗号


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

那应该对你有用。


16

虽然没有内置的方法可以做到这一点,但是您可以很简单地使用split()方法。

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

10

你可以将asList和split组合使用

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

10

这段代码将会有所帮助,

String myStr = "item1,item2,item3";
List myList = Arrays.asList(myStr.split(","));

希望这在 groovy 中能够工作,但是没有 :( - mdabdullah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接