在爪哇中有没有内置的方法允许我们将逗号分隔的字符串转换成一些容器(例如数组、列表或向量)?还是需要为此编写自定义代码?
1 2
| String commaSeparated ="item1 , item2 , item3";
ArrayList <String > items = //method that converts above string into list?? |
- 如果要分析csv,请参阅stackoverflow.com/questions/3908012/parsing-csv-in-java
- @但这不是OP要求的。
- 这里只有科林德的答案是正确的,假设你想要一个数组列表,就像问题标题中那样。arraylist(可变)与list完全不同,list可以只是一个简单的固定列表。
- @Fattie-Fair Point,并修复了它-stackoverflow.com/a/34735419/744133
- Java 8解决方案:StAccOfFult.COM/A/4685179/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。
- @它是一个正则表达式(regex)。\s匹配任何空白,*应用匹配零次或更多次。因此,\s*的意思是"匹配任何空格零次或更多次"。我们在逗号前后查找这个。因此,该分割将对EDCOX1、4、EDCOX1、5等字符串进行工作。在爪哇中,需要在字符串中避免反斜杠,因此得到EDCOX1×6。
- 我建议使用"[\\s,]+"来修剪值的空白。例如," item1 , item2 , item3 ,"变为["item1","item2","item3"]。
- @andreyne " item1 , item2 , item3 ,".split("[\\s,]+")返回长度为4的String[],而不是预期的3。
- 您必须将1作为对分割的限制("正则表达式"、"限制")方法,否则最终的空单元格被截断:参见:DOCS.Oracle .COM/JavaSe/ 8/DOCS/API/Java/Lang//Helip;
- csv可以在引号中包含逗号。示例:foo,"bar,baz",qux。在这种情况下,请参阅此答案以获得良好的regex:stackoverflow.com/a/1757107/1048340
- "[\\s,]+"还将在一个逗号分隔的标记内的内部空间上进行拆分,即使不存在逗号,它也会将两个空格视为分隔符,而不是逗号加上任何数量的周围空白。"\\s*(,\\s*)+"将只在逗号分隔的标记周围删除空白,并且忽略任何仅为空白或空的字符串。
- 附带说明:如果您希望在输入字符串为空的情况下得到一个空列表,那么这个方法不适合您的用例。您将得到一个包含空字符串的1个元素的列表。
- @Madispukkonen,你是绝对正确的,但是我非常尊重这个观点,认为他可以自己添加这样的逻辑。
- @阿列克谢虽然我很感激你尊重这次行动,但我不会说这样的话。我知道有些人在被错误地赞扬时不满足人们的期望而感到难过。只是一个想法。
Arrays.asList返回数组支持的固定大小的List。如果你想要一个正常的可变的java.util.ArrayList,你需要这样做:
1
| List <String > list = new ArrayList <String >(Arrays. asList(string. split(" ,"))); |
或者,使用番石榴:
1
| List<String> list = Lists.newArrayList(Splitter.on(" ,").split(string)); |
使用Splitter可以在拆分字符串的方式上提供更多的灵活性,并且可以跳过结果中的空字符串并修剪结果。它还有比String.split更不奇怪的行为,也不要求您使用regex进行拆分(这只是一个选项)。
- 会首选splitter.on(",".trimResults().split(string),尽管我看到你提到过。SO 1
- +1用于指出array.aslist不返回正常列表。如果尝试向该列表添加或从中删除元素,则会收到一个UnsupportedOperationException。
- 从(15.0)开始,guava现在有了这个:splitter.on(",").splittolist(string)。节省一小步。
- 如果我有这样的字符串,是否也可以像这样添加空值:1,3,4,5这里2丢失/空。在列表2中转换时将跳过。但我想把它作为空值添加。
- 这个实现和其他一些类似的例子的问题是,尽管Arrays.asList提供了一个围绕本机数组的包装器(避免元素复制),但new ArrayList(...)将完全执行这种逐元素复制。我们可能更喜欢一种方法,允许直接将解析的元素添加到所需的目标集合中。
两个步骤:
String [] items = commaSeparated.split(",");
List container = Arrays.asList(items);
- 一旦您内联items变量,它基本上与其他答案相同,但实际上效率更高,因为它不使用regex。另一方面,逗号周围的空格将终止此选项。
- @amrinderora对split的论证被解释为regex。
下面是另一个将csv转换为arraylist的方法:
打印你
-->string
-->with
-->comma
如果一个List是OP所说的最终目标,那么已经被接受的答案仍然是最短和最好的。不过,我希望使用Java 8流提供替代方案,如果它是流水线的一部分,则可以为您提供更多的好处。
通过将.split函数(本机数组)的结果包装到流中,然后转换为列表。
1 2 3
| List<String> list =
Stream.of("a,b,c".split(","))
.collect(Collectors.toList()); |
如果根据操作标题将结果存储为ArrayList很重要,则可以使用不同的Collector方法:
1 2 3
| ArrayList<String> list =
Stream.of("a,b,c".split(","))
.collect(Collectors.toCollection(ArrayList<String>::new)); |
或者通过使用regex解析API:
1 2 3 4
| ArrayList<String> list =
Pattern.compile(",")
.splitAsStream("a,b,c")
.collect(Collectors.toCollection(ArrayList<String>::new)); |
注意,您仍然可以考虑将List变量类型保留为List,而不是ArrayList。List的通用接口看起来仍然与ArrayList的实现非常相似。
就其本身而言,这些代码示例似乎不会增加很多内容(除了更多的类型),但是如果您打算做更多的工作,比如将字符串转换为长示例列表时的这个答案,那么流式API通过允许一个接一个地对您的操作进行管道传输,真的非常强大。
为了,你知道,完整。
没有内置的方法,但您可以在此中简单地使用split()方法。
1 2 3
| String commaSeparated ="item1 , item2 , item3";
ArrayList <String > items =
new ArrayList <String >(Arrays. asList(commaSeparated. split(","))); |
1
| List <String > items = Arrays. asList(commaSeparated. split(",")); |
这对你很有用。
1 2 3
| List <String > items = Stream. of(commaSeparated. split(","))
. map(String::trim )
. collect(toList ()); |
- 现在最好的答案之一。此答案+1中的列表可以更改。
- 变更collect(toList())至collect(Collectors.toList()后工作
- 实际上,collect(toList())使用Collectors.toList()的静态导入是为了简洁和流畅。
您可以组合aslist和split
1
| Arrays. asList(CommaSeparated. split("\\s*,\\s*")) |
此代码将有帮助,
1 2
| String myStr ="item1,item2,item3";
List myList = Arrays. asList(myStr. split(",")); |
您可以使用guava来拆分字符串,并将其转换为arraylist。这也适用于空字符串,并返回空列表。
1 2 3 4 5 6 7 8 9 10 11
| 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 ); |
输出以下内容:
1 2
| [item1, item2, item3]
[item1, item2, item3, another item] |
使用Collections的示例。
1 2 3 4 5 6
| import java.util.Collections;
...
String commaSeparated ="item1 , item2 , item3";
ArrayList <String > items = new ArrayList <>();
Collections. addAll(items, commaSeparated. split("\\s*,\\s*"));
... |
- 您避免使用中间数组.aslist。不幸的是,我们仍然有一个从数组元素到集合的副本。很好的记忆替代品。
使用Java 8中的流来解决这一问题的方法很多,但是IMO下面的一个内衬是直截了当的:
1 2 3 4 5
| 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.0153.76,16.140,60.00,,56.00,"listsplitedstring=new arraylist(arrays.aslist(s.split("\s*,\s*");
- 这是一个新问题,不要以评论的形式问它。可以创建一个新问题。
您可以首先使用String.split(",")将它们拆分,然后使用Arrays.asList(array)将返回的字符串array转换为ArrayList。
我通常使用预编译的模式。而且,这也稍微更普遍一些,因为它可以考虑在一些listtoString表达式之后使用方括号。
1 2 3 4 5 6 7 8 9
| 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(); |
在groovy中,可以使用tokenize(character token)方法:
1
| list = str.tokenize(',') |
1 2 3 4 5
| List commaseperated = new ArrayList();
String mylist ="item1 , item2 , item3";
mylist = Arrays. asList(myStr. trim(). split(" ,"));
// enter code here |
使用splitter类可以获得相同的结果。
1
| var list = Splitter.on(",").splitToList(YourStringVariable) |
(用柯特林写的)
1
| List <String > items = Arrays. asList(s. split("[,\\s]+")); |
你可以这样做。
这将删除空白,并在不需要担心空白的地方用逗号分隔。
1 2 3 4 5 6
| 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 ); |
string->collection转换:(string->string[]->collection)
1 2 3 4 5 6 7 8 9 10 11
| // 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())); |
collection->string[]转换:
string->string[]转换:
1
| String[] strArr = str. split(","); |
和集合->集合:
1
| List<String> list = new LinkedList<>(col); |
在Java 8中将集合转换为逗号分隔的字符串
listofstring对象包含["a"、"b"、"c"、"d"]个元素-
1
| listOfString.stream().map(ele->"'"+ele+"'").collect(Collectors.joining(",")) |
输出是:"A"、"B"、"C"、"
并在Java 8中将字符串数组转换为列表
1 2
| String string [] ={"A", "B", "C", "D"};
List <String > listOfString = Stream. of(string ). collect(Collectors. toList()); |
1 2
| ArrayList <HashMap <String, String >> mListmain = new ArrayList <HashMap <String, String >>();
String marray []= mListmain. split(","); |
- 那么,埃多克斯1号(17号)究竟在哪里?你读过这个问题吗?
- @梅佩特斯:有一个埃多克斯1〔17〕。我将编辑回滚到第一个修订版(这样您可以看到它),并改进了第一个修订版的格式。
- 问题是如何将字符串转换为arraylist,而不是如何将arraylist转换为arraylist。