如何将逗号分隔的String转换为ArrayList?

Jam*_*ame 513 java string collections split

Java中是否有任何内置方法允许我们将逗号分隔的String转换为某个容器(例如数组,List或Vector)?或者我需要为此编写自定义代码?

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??
Run Code Online (Sandbox Code Playgroud)

Ale*_*exR 964

将逗号分隔的String转换为List

List<String> items = Arrays.asList(str.split("\\s*,\\s*"));
Run Code Online (Sandbox Code Playgroud)

上面的代码将字符串拆分为定义为:的分隔符zero or more whitespace, a literal comma, zero or more whitespace,它将单词放入列表中并折叠单词和逗号之间的任何空格.


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

  • @rosch它是一个正则表达式(正则表达式).`\ s`匹配任何空格,`*`将匹配应用于零或更多次.所以`\ s*`表示"匹配任何空白零次或多次".我们在逗号之前和之后寻找这个.因此,拆分将适用于诸如`"item1,item2,item3"`或`"item1,item2,item3"`等字符串.在Java中,您需要转义字符串中的反斜杠,因此您得到`\\ S*` (39认同)
  • 我建议使用``[\\ s,] +"`修剪值的空白区域.例如,``item1,item2,item3,``变成`["item1","item2","item3"]`. (8认同)
  • `"[\\ s,] +"`也将在逗号分隔的标记内的内部空间上拆分,即使逗号不存在,它也会将空格都视为分隔符,而不是逗号加上任意数量的周围空格.`"\\ s*(,\\ s*)+"`将仅在逗号分隔的标记周围修剪空格,并且还忽略任何只有空格或空格的字符串. (5认同)
  • 作为旁注:如果您希望在输入字符串为空的情况下获得空列表,则此方法不适合您的用例.您将获得一个包含1个包含空字符串的元素的列表. (2认同)
  • @MadisPukkonen,您绝对正确,但是我尊重OP,以为他可以自己添加这样的逻辑。 (2认同)
  • @AlexR虽然我很欣赏你尊重OP,但是,我不会说这些话.我知道有人因为错误地称赞而不满足人们的期望而感到难过.只是一个想法. (2认同)

Col*_*inD 190

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

List<String> list = new ArrayList<String>(Arrays.asList(string.split(" , ")));
Run Code Online (Sandbox Code Playgroud)

或者,使用番石榴:

List<String> list = Lists.newArrayList(Splitter.on(" , ").split(string));
Run Code Online (Sandbox Code Playgroud)

使用a Splitter可以更灵活地分割字符串,并使您能够在结果中跳过空字符串并修剪结果.它也没有那么奇怪的行为String.split,也没有要求你用正则表达式分割(这只是一个选项).

  • +1表示Arrays.asList没有返回正常列表.如果您尝试向该列表添加元素或从该列表中删除元素,您将获得UnsupportedOperationException. (10认同)
  • Guava现在有这个(15.0):**Splitter.on(",").splitToList(string)**.节省一小步. (9认同)
  • 本来希望**Splitter.on(",").trimResults().split(string)**虽然我看到你确实提到过它.所以+1 (6认同)

duf*_*ymo 69

两个步骤:

  1. String [] items = commaSeparated.split("\\s*,\\s*");
  2. List<String> container = Arrays.asList(items);

  • @AmrinderArora将`split`的参数解释为RegEx. (2认同)

Arv*_*vp6 22

这是另一个将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));
}
Run Code Online (Sandbox Code Playgroud)

打印你

- > string
- > with
- >逗号


YoY*_*oYo 20

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

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

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

如果将结果存储为ArrayListOP中的标题非常重要,则可以使用其他Collector方法:

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

或者使用RegEx解析api:

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

请注意,您仍然可以考虑将list变量键入List<String>而不是ArrayList<String>.通用接口List看起来仍然非常类似于ArrayList实现.

这些代码示例本身似乎没有增加太多(除了更多的输入),但是如果你打算做更多的事情,比如将String转换为Longs列表的答案,那么流API就非常强大了一个接一个地管理你的操作.

为了,你知道,完整性.


小智 15

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

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


Man*_*anu 15

List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());
Run Code Online (Sandbox Code Playgroud)

  • 将 `collect(toList())` 更改为 `collect(Collectors.toList()` 后有效 (3认同)
  • 现在最好的答案之一。可以在此答案中更改列表+1。 (2认同)
  • 事实上`collect(toList())` 使用`Collectors.toList()` 的静态导入来简洁和流畅:) (2认同)

Jas*_*ler 13

List<String> items = Arrays.asList(commaSeparated.split(","));
Run Code Online (Sandbox Code Playgroud)

这对你有用.


cor*_*iKa 10

你可以结合asList和split

Arrays.asList(CommaSeparated.split("\\s*,\\s*"))
Run Code Online (Sandbox Code Playgroud)


Sri*_*n.S 8

这段代码会有所帮助,

String myStr = "item1,item2,item3";
List myList = Arrays.asList(myStr.split(","));
Run Code Online (Sandbox Code Playgroud)


小智 6

Java 9 引入了 List.of():

String commaSeparated = "item1 , item2 , item3";
List<String> items = List.of(commaSeparated.split(" , "));
Run Code Online (Sandbox Code Playgroud)


Bra*_*rks 5

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

输出以下内容:

[item1, item2, item3]
[item1, item2, item3, another item]
Run Code Online (Sandbox Code Playgroud)


i_a*_*ero 5

有很多方法可以使用Java 8 中的流来解决这个问题,但 IMO 以下一个衬垫是直接的:

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());
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

866085 次

最近记录:

6 年 前