Java中是否有任何内置方法可以将逗号分隔的String转换为某个容器(例如数组,List或Vector)?还是我需要为此编写自定义代码?
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??
Java中是否有任何内置方法可以将逗号分隔的String转换为某个容器(例如数组,List或Vector)?还是我需要为此编写自定义代码?
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??
Answers:
将逗号分隔的字符串转换为列表
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>
。
\s
匹配任何空格,将*
匹配应用零次或多次。因此,\s*
意味着“将任何空白匹配零次或多次”。我们在逗号前后寻找它。因此,该拆分将适用于诸如"item1 , item2 , item3"
,或"item1,item2 ,item3"
等字符串。在Java中,您需要在字符串中转义反斜杠,以便获得\\s*
"[\\s,]+"
修剪空白值。例如," item1 , item2 , item3 , "
变为["item1", "item2", "item3"]
。
"[\\s,]+"
还会在逗号分隔的标记内的内部空间上进行拆分,即使没有逗号,也会将这两个空格都视为定界符,而不是逗号加上任意数量的周围空格。"\\s*(,\\s*)+"
将仅在逗号分隔的标记周围修剪空白,并且也忽略仅空白或为空的任何字符串。
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
不要求您使用正则表达式拆分(这只是一种选择),具有更奇怪的行为。
Arrays.asList
提供了围绕本机数组的包装器(避免了元素复制),但是new ArrayList(...)
确实会逐元素复制这样的元素。我们可能应该选择一种方法,该方法允许将已解析的元素直接添加到所需的目标集合中。
两步:
String [] items = commaSeparated.split("\\s*,\\s*");
List<String> container = Arrays.asList(items);
split
被解释为RegEx。
如果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确实很强大,它允许一个接一个地传递您的操作。
为了完整起见。
List<String> items= Stream.of(commaSeparated.split(","))
.map(String::trim)
.collect(toList());
collect(toList())
到collect(Collectors.toList()
collect(toList())
是Collectors.toList()
为了简洁和流畅使用静态导入 :)
您可以使用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]
使用的示例Collections
。
import java.util.Collections;
...
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = new ArrayList<>();
Collections.addAll(items, commaSeparated.split("\\s*,\\s*"));
...
有很多方法可以使用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());
使用Splitter类可以实现相同的结果。
var list = Splitter.on(",").splitToList(YourStringVariable)
(用科特林编写)
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]+"));
字符串->集合转换:(字符串->字符串[]->集合)
// 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
。我将编辑回滚到第一个修订版(以便您可以看到),并改进了第一个修订版的格式。