Java 中是否有任何内置方法允许我们将逗号分隔的字符串转换为某个容器(例如数组、列表或向量)?还是我需要为此编写自定义代码?
String commaSeparated = "item1 , item2 , item3";
List<String> items = //method that converts above string into list??
将逗号分隔的字符串转换为列表
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>
。
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
少,并且不需要您按正则表达式拆分(这只是一种选择)。
Arrays.asList
提供了对本机数组的包装(避免元素复制),但 new ArrayList(...)
将准确地逐个元素地进行这样的复制。我们可能应该更喜欢一种允许将解析的元素直接添加到所需目标集合的方法。
两步:
String [] items = commaSeparated.split("\\s*,\\s*"); List
split
的参数被解释为正则表达式。
List<String> items= Stream.of(commaSeparated.split(","))
.map(String::trim)
.collect(Collectors.toList());
collect(toList())
更改为 collect(Collectors.toList()
后工作
collect(toList())
使用 Collectors.toList()
的静态导入是为了简洁和流畅:)
如果 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 非常强大,它允许一个接一个地流水线化您的操作.
你知道,为了完整性。
这是另一种将 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));
}
打印你
--> 字符串 --> 带 --> 逗号
List<String> items = Arrays.asList(commaSeparated.split(","));
那应该对你有用。
没有内置方法,但您可以在其中简单地使用 split() 方法。
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items =
new ArrayList<String>(Arrays.asList(commaSeparated.split(",")));
你可以结合 asList 和 split
Arrays.asList(CommaSeparated.split("\\s*,\\s*"))
这段代码会有所帮助,
String myStr = "item1,item2,item3";
List myList = Arrays.asList(myStr.split(","));
groovy
中工作,但没有:(
您可以使用 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;
}
在 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());
使用 Collections
的示例。
import java.util.Collections;
...
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = new ArrayList<>();
Collections.addAll(items, commaSeparated.split("\\s*,\\s*"));
...
Java 9 引入了 List.of():
String commaSeparated = "item1 , item2 , item3";
List<String> items = List.of(commaSeparated.split(" , "));
您可以先使用 String.split(",")
拆分它们,然后使用 Arrays.asList(array)
将返回的字符串 array
转换为 ArrayList
在 groovy 中,您可以使用 tokenize(Character Token) 方法:
list = str.tokenize(',')
使用 Splitter 类可以获得相同的结果。
var list = Splitter.on(",").splitToList(YourStringVariable)
(用科特林写的)
虽然这个问题很老并且已经被多次回答,但没有一个答案能够管理以下所有情况:
"" -> 空字符串应该映射到空列表
" 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"]
)。
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));
// enter code here
我通常对列表使用预编译模式。而且这稍微更通用,因为它可以考虑一些 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();
List<String> items = Arrays.asList(s.split("[,\\s]+"));
在 Kotlin 中,如果您的字符串列表是这样的,并且您可以将字符串转换为 ArrayList,请使用这行代码
var str= "item1, item2, item3, item4"
var itemsList = str.split(", ")
在java中,可以这样做
String catalogue_id = "A, B, C";
List<String> catalogueIdList = Arrays.asList(catalogue_id.split(", [ ]*"));
您可以按如下方式进行。
这将删除空格并用逗号分隔,您无需担心空格。
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);
字符串 -> 集合转换:(字符串 -> 字符串 [] -> 集合)
// 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);
在 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());
ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>();
String marray[]= mListmain.split(",");
ArrayList
到底在哪里?你甚至读过这个问题吗?
ArrayList
。我将编辑回滚到第一个修订版(以便您可以看到)并改进了第一个修订版的格式。
\s
匹配任何空白,*
应用匹配零次或多次。所以\s*
表示“匹配任何空白零次或多次”。我们在逗号前后查找。因此,拆分将适用于"item1 , item2 , item3"
或"item1,item2 ,item3"
等字符串。在 Java 中,您需要转义字符串中的反斜杠,因此您会得到\\s*
"[\\s,]+"
还将在逗号分隔的标记内分割内部空间,即使不存在逗号,它也会将两个空格视为分隔符,而不是逗号加上任意数量的周围空格。"\\s*(,\\s*)+"
将只修剪逗号分隔的标记周围的空格,并忽略任何只有空格或空的字符串。