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

Posted

技术标签:

【中文标题】如何将逗号分隔的字符串转换为列表?【英文标题】:How to convert comma-separated String to List? 【发布时间】:2011-11-21 06:21:27 【问题描述】:

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

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

【问题讨论】:

如果你想解析 CSV 看***.com/questions/3908012/parsing-csv-in-java @Raedwald 这不是 OP 所要求的 ONLY ColinD 的答案在这里是正确的,假设您想要问题标题中的 ArrayList。 ArrayList(可变)与List完全不同,List可以只是一个简单的固定列表。 @Fattie - 公平点,并修复了 - ***.com/a/34735419/744133 Java 8 解决方案:***.com/a/46485179/1216775 【参考方案1】:

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

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&lt;String&gt;

【讨论】:

@rosch 它是一个正则表达式 (regex)。 \s 匹配任何空白,* 应用匹配零次或多次。所以\s* 的意思是“匹配任何空白零次或多次”。我们在逗号前后查找。因此,拆分将适用于"item1 , item2 , item3""item1,item2 ,item3"等字符串。在Java中,您需要对字符串中的反斜杠进行转义,因此您会得到\\s* 我建议使用"[\\s,]+" 来修剪值的空格。例如," item1 , item2 , item3 , " 变为 ["item1", "item2", "item3"] "[\\s,]+" 也将在逗号分隔的标记内分割内部空间,即使不存在逗号,它也会将两个空格视为分隔符,而不是逗号加上任意数量的周围空格。 "\\s*(,\\s*)+" 将只修剪逗号分隔的标记周围的空格,并忽略任何只有空格或空的字符串。 附带说明:如果您希望在输入字符串为空的情况下得到一个空列表,那么此方法不适合您的用例。您将获得一个包含 1 个元素的列表,其中包含一个空字符串。 @AlexR 虽然我很感激你尊重 OP,但是,我不会说这样的话。我知道有些人在受到错误的表扬时会因为没有达到人们的期望而感到难过。只是一个想法。【参考方案2】:

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 相比,它的怪异行为也更少,并且不需要您按正则表达式进行拆分(这只是一种选择)。

【讨论】:

会更喜欢 Splitter.on(",").trimResults().split(string) 虽然我看到你确实提到了它。所以+1 +1 指出 Arrays.asList 不返回正常列表。如果您尝试在该列表中添加或删除元素,您将收到 UnsupportedOperationException。 Guava 现在从 (15.0) 开始有了这个:Splitter.on(",").splitToList(string)。节省了一小步。 如果我有这样的字符串,还有什么方法可以在字符串中添加空值:1,,3,4,5 这里 2 丢失/为空。在列表 2 中转换时将跳过。但我想将其添加为空值。 这个实现的问题,以及其他一些类似的例子,是尽管Arrays.asList 提供了一个原生数组的包装器(避免元素复制),new ArrayList(...) 将完全做到这样一个逐个元素复制。我们可能应该更喜欢一种允许将解析后的元素直接添加到所需目标集合的方法。【参考方案3】:

两步:

    String [] items = commaSeparated.split("\\s*,\\s*"); List&lt;String&gt; container = Arrays.asList(items);

【讨论】:

内联 items 变量后,它与其他答案基本相同,但实际上效率更高,因为它不使用正则表达式。另一方面,逗号周围的空格会取消此选项。 @AmrinderArora split 的参数被解释为正则表达式。【参考方案4】:
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());

【讨论】:

现在最好的答案之一。可以在此答案 +1 中更改列表。 在将 collect(toList()) 更改为 collect(Collectors.toList() 后工作 事实上 collect(toList()) 正在使用 Collectors.toList() 的静态导入以简洁流畅:) 很神奇,因为它涵盖了空字符串和单字符串不带分隔符的情况。【参考方案5】:

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

通过将 .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&lt;String&gt;,而不是ArrayList&lt;String&gt;List 的通用接口看起来仍然与 ArrayList 实现非常相似。

就其本身而言,这些代码示例似乎并没有增加很多内容(除了更多的输入),但如果您打算做更多的事情,例如 this answer on converting a String to a List of Longs 举例说明,流式 API 非常强大,它允许将您的操作流水线化在另一个之后。

为了完整性。

【讨论】:

【参考方案6】:

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

打印你

-->字符串 -->与 -->逗号

【讨论】:

【参考方案7】:
List<String> items = Arrays.asList(commaSeparated.split(","));

这应该适合你。

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

你可以组合 asList 和 split

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

【讨论】:

【参考方案10】:

这段代码会有所帮助,

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

【讨论】:

希望这可以在groovy 中工作,但没有:(【参考方案11】:

您可以使用 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]

【讨论】:

【参考方案12】:

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 splittedString = new ArrayList(Arrays.asList(s.split("\\s*,\\s*"))); 这是一个新问题,请勿将其作为评论提出。随意创建一个新问题。【参考方案13】:

一个使用Collections的例子。

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

【讨论】:

您避免了中间的 Arrays.asList。不幸的是,我们仍然有一个从数组元素到集合的副本。值得记住的好选择。【参考方案14】:

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

【讨论】:

【参考方案15】:

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

list = str.tokenize(',')

【讨论】:

这个救了我!谢谢。【参考方案16】:

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

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

(用 kotlin 编写)

【讨论】:

文档说这个功能是测试版并且不稳定。【参考方案17】:

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

"" -> 空字符串应该映射到空列表 " a, b , c " -> 应该修剪所有元素,包括第一个和最后一个元素 ",," -> 应该删除空元素

因此,我使用以下代码(使用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"])。

【讨论】:

【参考方案18】:

Java 9 引入 List.of():

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

【讨论】:

【参考方案19】:
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));

// enter code here

【讨论】:

【参考方案20】:

我通常对列表使用预编译模式。而且这也稍微通用一些,因为它可以考虑一些 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();

【讨论】:

【参考方案21】:
List<String> items = Arrays.asList(s.split("[,\\s]+"));

【讨论】:

【参考方案22】:

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

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

【讨论】:

【参考方案23】:

在java中,可以这样实现

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

【讨论】:

【参考方案24】:

你可以这样做。

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

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

【讨论】:

【参考方案25】:

String -> Collection 转换:(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()));

集合 -> String[] 转换:

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

String -> String[] 转换:

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

还有收藏->收藏

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

【讨论】:

【参考方案26】:

Java 8

中将集合转换为逗号分隔的字符串

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

【讨论】:

【参考方案27】:
ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>(); 
String marray[]= mListmain.split(",");

【讨论】:

ArrayList 到底在哪里?你甚至读过这个问题吗? @mapeters:有一个ArrayList。我将编辑回滚到第一个修订版(以便您可以看到)并改进了第一个修订版的格式。 问题是如何将字符串转换为ArrayList,而不是如何将ArrayList转换为Array。

以上是关于如何将逗号分隔的字符串转换为列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将空格和逗号分隔的数字字符串转换为 int 列表? [复制]

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

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

使用 Python 将多个字符串元素列表转换为单个元素以逗号分隔的列表

javascript 将字符串数组转换为以逗号分隔的列表

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