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


538

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

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


@Raedwald那不是OP所要求的
Crowie

3
假设您想要问题标题中的ArrayList,那么只有 ColinD的答案在这里是正确的。ArrayList(可变的)与List完全不同,后者可以只是一个简单的固定列表。
Fattie

@Fattie -公平点,固定的- stackoverflow.com/a/34735419/744133
溜溜球

Answers:


1016

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

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

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


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


39
@rosch它是一个正则表达式(regex)。\s匹配任何空格,将*匹配应用零次或多次。因此,\s*意味着“将任何空白匹配零次或多次”。我们在逗号前后寻找它。因此,该拆分将适用于诸如"item1 , item2 , item3",或"item1,item2 ,item3"等字符串。在Java中,您需要在字符串中转义反斜杠,以便获得\\s*
andrewrjones 2012年

9
我建议使用"[\\s,]+"修剪空白值。例如," item1 , item2 , item3 , "变为["item1", "item2", "item3"]
Andrii Nemchenko 2014年

5
"[\\s,]+"还会在逗号分隔的标记内的内部空间上进​​行拆分,即使没有逗号,也会将这两个空格都视为定界符,而不是逗号加上任意数量的周围空格。"\\s*(,\\s*)+"将仅在逗号分隔的标记周围修剪空白,并且也忽略仅空白或为空的任何字符串。
theferrit32

2
附带说明:如果您期望在输入字符串为空的情况下得到一个空列表,则此方法不适合您的用例。您将获得一个包含1个包含空字符串的元素的列表。
Madis Pukkonen

3
@AlexR尽管我感谢您尊重OP,但是,我会避免说这种话。我知道有人被错误地称赞时会因未能达到人们的期望而感到难过。只是一个想法。

199

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));

使用a Splitter可以更灵活地分割字符串,并可以跳过结果中的空字符串并修剪结果。它也比String.split不要求您使用正则表达式拆分(这只是一种选择),具有更奇怪的行为。


6
最好使用Splitter.on(“,”)。trimResults()。split(string),尽管我看到您确实提到了它。所以+1
John B

10
+1指出Arrays.asList不返回普通列表。如果您尝试向该列表添加元素或从中删除元素,则会收到UnsupportedOperationException。
Alfredo Osorio

9
从(15.0)开始,番石榴具有此功能:Splitter.on(“,”)。splitToList(string)。节省一小步。
Kango_V

如果我有这样的String,有什么方法可以在String iike中也添加空值:1,,3,4,5这里2丢失/为空。在列表2中进行转换时,将跳过。但我想将此添加为空值。
A.Aleem11年11

这种实现方式以及其他一些类似示例的问题在于,尽管此类Arrays.asList提供了围绕本机数组的包装器(避免了元素复制),但是new ArrayList(...)确实会逐元素复制这样的元素。我们可能应该选择一种方法,该方法允许将已解析的元素直接添加到所需的目标集合中。
YoYo

70

两步:

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

1
内联items变量后,它基本上与其他答案相同,但实际上效率更高了一点,因为它不使用正则表达式。另一方面,逗号周围的空格将终止此选项。
Amrinder Arora

2
@AmrinderArora参数split被解释为RegEx。
Madbreaks

23

这是另一个将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));
}

打印你

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


21

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

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

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

如果将结果ArrayList按照OP中的标题存储为重要,则可以使用其他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实现。

这些代码示例本身似乎并没有增加太多(除了更多的键入操作),但是如果您打算做更多的事情,例如将字符串转换为Longs列表的答案示例,则流API确实很强大,它允许一个接一个地传递您的操作。

为了完整起见。


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

1
现在最好的答案之一。可以在此答案+1中更改列表。
塞德里克

工程变更后collect(toList())collect(Collectors.toList()
Sundararaj Govindasamy

实际上collect(toList())Collectors.toList()为了简洁和流畅使用静态导入 :)
Manu

15

没有内置方法,但是您可以在其中简单地使用split()方法。

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

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

那应该为您工作。


10

您可以结合使用asList和split

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

8

此代码会有所帮助,

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

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);

输出以下内容:

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

4

使用的示例Collections

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

1
您避免了中介Arrays.asList。不幸的是,我们仍然有从数组元素到集合的副本。记住的好选择。
YoYo

4

有很多方法可以使用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());

有谁知道我怎么能将此字符串转换为逗号分隔列表--String s =“ 2017-07-12 23:40:00.0,153.76,16.140,60.00,,56.00,”; List <String> splittedString =新的ArrayList <String>(Arrays.asList(s.split(“ \\ s *,\\ s *”))));
阳光明媚,时间

1
这是一个新问题,请勿提出评论。随时提出一个新问题。
乔治Siggouroglou,

2

您可以先使用分割它们String.split(","),然后将返回的String array转换为ArrayListusingArrays.asList(array)


2

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

list = str.tokenize(',')

这个救了我!谢谢。
tamerlaha

2

使用Splitter类可以实现相同的结果。

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

(用科特林编写)


1
文档说此功能是beta版本,不稳定。
Rubberducker '18 -10-17

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

// enter code here

1

我通常将预编译模式用于列表。而且,由于它可以考虑某些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();

1

在Kotlin中,如果您的String列表是这样的,并且可以用于将字符串转换为ArrayList,请使用以下代码行

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


0

您可以按照以下步骤进行操作。

这将删除空格并按逗号分隔,您无需担心空格。

    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);

-1

字符串->集合转换:(字符串->字符串[]->集合)

//         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()));

集合-> String []转换:

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

字符串->字符串[]转换:

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

收集->收集

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

-2

Java 8中以逗号分隔的形式将Collection转换为字符串

listOfString对象包含[“ A”,“ B”,“ C”,“ D”]元素-

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

输出是:- 'A','B','C','D'

并将字符串数组转换为Java 8中的列表

    String string[] ={"A","B","C","D"};
    List<String> listOfString = Stream.of(string).collect(Collectors.toList());

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

5
究竟在哪里ArrayList?你甚至读过这个问题吗?
Debosmit Ray

@mapeters:有一个ArrayList。我将编辑回滚到第一个修订版(以便您可以看到),并改进了第一个修订版的格式。
杜尔

问题是如何将字符串转换为ArrayList,而不是如何将ArrayList转换为Array。
同志
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.