ChatGPT解决这个技术问题 Extra ChatGPT

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

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

String commaSeparated = "item1 , item2 , item3";
List<String> items = //method that converts above string into list??
如果您想解析 CSV,请参阅 stackoverflow.com/questions/3908012/parsing-csv-in-java
@Raedwald但这不是OP所要求的
只有 ColinD 的答案在这里是正确的,假设你想要一个 ArrayList 作为问题标题。 ArrayList(可变)与 List 完全不同,List 可以只是一个简单的固定列表。
@Fattie - 公平点,并修复了 - stackoverflow.com/a/34735419/744133
Java 8 解决方案:stackoverflow.com/a/46485179/1216775

F
Fattie

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

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>


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

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(...) 将准确地逐个元素地进行这样的复制。我们可能应该更喜欢一种允许将解析的元素直接添加到所需目标集合的方法。
d
duffymo

两步:

String [] items = commaSeparated.split("\\s*,\\s*"); List 容器 = Arrays.asList(items);


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

现在最好的答案之一。可以在此答案 +1 中更改列表。
collect(toList()) 更改为 collect(Collectors.toList() 后工作
实际上 collect(toList()) 使用 Collectors.toList() 的静态导入是为了简洁和流畅:)
这很神奇,因为它涵盖了空字符串和没有分隔符的单字符串的情况。
Y
YoYo

如果 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<String> 而不是 ArrayList<String>List 的通用接口看起来仍然与 ArrayList 实现非常相似。

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

你知道,为了完整性。


P
Prasad Jadhav

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

打印你

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


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

那应该对你有用。


I
Ishara

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

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

c
corsiKa

你可以结合 asList 和 split

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

S
Sundararaj Govindasamy

这段代码会有所帮助,

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

希望这能在 groovy 中工作,但没有:(
B
Brad Parks

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

您也可以在没有 Guava 的情况下使用以下方法:

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

a
akhil_mittal

在 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*")));
这是一个新问题,请勿将其作为评论提出。随意创建一个新问题。
F
Filippo Lauria

使用 Collections 的示例。

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

您避免了中间的 Arrays.asList。不幸的是,我们仍然有一个从数组元素到集合的副本。值得记住的好选择。
o
ognjenkl

Java 9 引入了 List.of():

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

S
Saket

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


s
sivareddy963

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

list = str.tokenize(',')

这个救了我!谢谢你。
c
chair_person

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

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

(用科特林写的)


文档说这个功能是测试版并且不稳定。
J
Julien Kronegg

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

"" -> 空字符串应该映射到空列表

" 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"])。


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

// enter code here

J
Jan Stanicek

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

T
Tunaki
List<String> items = Arrays.asList(s.split("[,\\s]+"));

V
Vijendra patidar

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

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

Y
Yang Yu

在java中,可以这样做

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

D
Du-Lacoste

您可以按如下方式进行。

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

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

F
Farzan Skt

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

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

A
Ajay Kumar

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

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

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