在Java中是否有任何内置的方法允许我们将逗号分隔的字符串转换为一些容器(例如数组,列表或向量)?或者我需要为此编写自定义代码吗?
String commaSeparated = "item1 , item2 , item3";
List<String> items = //method that converts above string into list??
在Java中是否有任何内置的方法允许我们将逗号分隔的字符串转换为一些容器(例如数组,列表或向量)?或者我需要为此编写自定义代码吗?
String commaSeparated = "item1 , item2 , item3";
List<String> items = //method that converts above string into list??
当前回答
虽然这个问题已经很老了,并且已经被回答了很多次,但没有一个答案能够处理以下所有情况:
->空字符串应该映射到空列表 " 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”)。
其他回答
我通常使用预编译模式的列表。而且这也更通用一些,因为它可以考虑一些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();
这段代码会有帮助,
String myStr = "item1,item2,item3";
List myList = Arrays.asList(myStr.split(","));
您可以使用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]
你也可以不使用番石榴使用以下方法:
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, 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”)。
你可以先使用String.split(",")分割它们,然后使用Arrays.asList(array)将返回的String数组转换为数组列表