简体   繁体   English

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

[英]How to convert comma-separated String to List?

Is there any built-in method in Java which allows us to convert comma separated String to some container (eg array, List or Vector)? Java 中是否有任何内置方法允许我们将逗号分隔的字符串转换为某个容器(例如数组、列表或向量)? Or do I need to write custom code for that?还是我需要为此编写自定义代码?

String commaSeparated = "item1 , item2 , item3";
List<String> items = //method that converts above string into list??

Convert comma separated String to List将逗号分隔的字符串转换为列表

List<String> items = Arrays.asList(str.split("\\s*,\\s*"));

The above code splits the string on a delimiter defined as: zero or more whitespace, a literal comma, zero or more whitespace which will place the words into the list and collapse any whitespace between the words and commas.上面的代码在分隔符上拆分字符串,定义为: zero or more whitespace, a literal comma, zero or more whitespace ,这些空格会将单词放入列表并折叠单词和逗号之间的任何空格。


Please note that this returns simply a wrapper on an array: you CANNOT for example .remove() from the resulting List .请注意,这仅返回数组的包装器:例如,您不能从结果List中获取.remove() For an actual ArrayList you must further use new ArrayList<String> .对于实际的ArrayList ,您必须进一步使用new ArrayList<String>

Arrays.asList returns a fixed-size List backed by the array. Arrays.asList返回由数组支持的固定大小的List If you want a normal mutable java.util.ArrayList you need to do this:如果你想要一个普通的可变java.util.ArrayList你需要这样做:

List<String> list = new ArrayList<String>(Arrays.asList(string.split(" , ")));

Or, using Guava :或者,使用番石榴

List<String> list = Lists.newArrayList(Splitter.on(" , ").split(string));

Using a Splitter gives you more flexibility in how you split the string and gives you the ability to, for example, skip empty strings in the results and trim results.使用拆分Splitter可以让您更灵活地拆分字符串,并让您能够跳过结果中的空字符串并修剪结果。 It also has less weird behavior than String.split as well as not requiring you to split by regex (that's just one option).String.split相比,它的怪异行为也更少,并且不需要您按正则表达式进行拆分(这只是一种选择)。

两步:

  1. String [] items = commaSeparated.split("\\s*,\\s*");
  2. List<String> container = Arrays.asList(items);
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(Collectors.toList());

If a List is the end-goal as the OP stated, then already accepted answer is still the shortest and the best.如果List是 OP 所述的最终目标,那么已经接受的答案仍然是最短和最好的。 However I want to provide alternatives using Java 8 Streams , that will give you more benefit if it is part of a pipeline for further processing.但是,我想使用Java 8 Streams提供替代方案,如果它是用于进一步处理的管道的一部分,它将为您带来更多好处。

By wrapping the result of the .split function (a native array) into a stream and then converting to a list.通过将 .split 函数(本机数组)的结果包装到流中,然后转换为列表。

List<String> list =
  Stream.of("a,b,c".split(","))
  .collect(Collectors.toList());

If it is important that the result is stored as an ArrayList as per the title from the OP, you can use a different Collector method:如果根据 OP 的标题将结果存储为ArrayList很重要,则可以使用不同的Collector方法:

ArrayList<String> list = 
  Stream.of("a,b,c".split(","))
  .collect(Collectors.toCollection(ArrayList<String>::new));

Or by using the RegEx parsing api:或者通过使用 RegEx 解析 api:

ArrayList<String> list = 
  Pattern.compile(",")
  .splitAsStream("a,b,c")
  .collect(Collectors.toCollection(ArrayList<String>::new));

Note that you could still consider to leave the list variable typed as List<String> instead of ArrayList<String> .请注意,您仍然可以考虑将list变量类型保留为List<String>而不是ArrayList<String> The generic interface for List still looks plenty of similar enough to the ArrayList implementation. List的通用接口看起来仍然与ArrayList实现非常相似。

By themselves, these code examples do not seem to add a lot (except more typing), but if you are planning to do more, like this answer on converting a String to a List of Longs exemplifies, the streaming API is really powerful by allowing to pipeline your operations one after the other.就其本身而言,这些代码示例似乎并没有增加很多(除了更多的输入),但是如果您打算做更多,就像这个关于将字符串转换为长的列表的答案所示例的那样,流式 API 非常强大,因为它允许一个接一个地流水线化您的操作。

For the sake of, you know, completeness.你知道,为了完整性。

Here is another one for converting CSV to ArrayList:这是另一种将 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));
}

Prints you打印你

-->string -->字符串
-->with --> 有
-->comma -->逗号

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

那应该对你有用。

There is no built-in method for this but you can simply use split() method in this.没有内置方法,但您可以在其中简单地使用 split() 方法。

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

This code will help,这段代码会有所帮助,

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

你可以结合 asList 和 split

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

You can use Guava to split the string, and convert it into an ArrayList.您可以使用 Guava 拆分字符串,并将其转换为 ArrayList。 This works with an empty string as well, and returns an empty list.这也适用于空字符串,并返回一个空列表。

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

outputs the following:输出以下内容:

[item1, item2, item3]
[item1, item2, item3, another item]

You could also use the following approach without Guava:您也可以在没有 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;
  }

There are many ways to solve this using streams in Java 8 but IMO the following one liners are straight forward: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());

An example using Collections .使用Collections的示例。

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

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

list = str.tokenize(',')

Same result you can achieve using the Splitter class.使用 Splitter 类可以获得相同的结果。

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

(written in kotlin) (用科特林写的)

While this question is old and has been answered multiple times, none of the answers is able to manage the all of the following cases:虽然这个问题很老并且已经被多次回答,但没有一个答案能够管理以下所有情况:

  • "" -> empty string should be mapped to empty list "" -> 空字符串应该映射到空列表
  • " a, b , c " -> all elements should be trimmed, including the first and last element " a, b , c " -> 所有元素都应该被修剪,包括第一个和最后一个元素
  • ",," -> empty elements should be removed ",," -> 应该删除空元素

Thus, I'm using the following code (using org.apache.commons.lang3.StringUtils , eg https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.11 ):因此,我使用以下代码(使用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());

Using a simple split expression has an advantage: no regular expression is used, so the performance is probably higher.使用简单的拆分表达式有一个优势:没有使用正则表达式,因此性能可能更高。 The commons-lang3 library is lightweight and very common. commons-lang3库是轻量级的并且非常常见。

Note that the implementation assumes that you don't have list element containing comma (ie "a, 'b,c', d" will be parsed as ["a", "'b", "c'", "d"] , not to ["a", "b,c", "d"] ).请注意,该实现假定您没有包含逗号的列表元素(即"a, 'b,c', d"将被解析为["a", "'b", "c'", "d"] ,而不是["a", "b,c", "d"] )。

Java 9 introduced List.of(): Java 9 引入了 List.of():

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

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

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

// enter code here

I usually use precompiled pattern for the list.我通常对列表使用预编译模式。 And also this is slightly more universal since it can consider brackets which follows some of the listToString expressions.而且这稍微更通用,因为它可以考虑一些 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]+"));

In Kotlin if your String list like this and you can use for convert string to ArrayList use this line of code在 Kotlin 中,如果您的字符串列表是这样的,并且您可以将字符串转换为 ArrayList,请使用这行代码

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

In java, It can be done like this在java中,可以这样做

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

You can do it as follows.您可以按如下方式进行。

This removes white space and split by comma where you do not need to worry about white spaces.这将删除空格并用逗号分隔,您无需担心空格。

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

This method will convert your string to an array, taking two parameters: the string you want converted, and the characters that will separate the values in the string.此方法会将您的字符串转换为一个数组,采用两个参数:您要转换的字符串,以及将字符串中的值分开的字符。 It converts it, and then returns the converted array.它转换它,然后返回转换后的数组。

private String[] convertStringToArray(String stringIn, String separators){ private String[] convertStringToArray(String stringIn, 字符串分隔符){

    // separate string into list depending on separators
    List<String> tempList = Arrays.asList(stringIn.split(separators));
    
    // create a new pre-populated array based on the size of the list
    String[] itemsArray = new String[tempList.size()];
    
    // convert the list to an array
    itemsArray = tempList.toArray(itemsArray);
    
    return itemsArray;
}

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

//         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[] conversion:集合 -> String[]转换:

String[] se = col.toArray(new String[col.size()]);

String -> String[] conversion:字符串 -> 字符串 []转换:

String[] strArr = str.split(",");

And Collection -> Collection :收藏-> 收藏

List<String> list = new LinkedList<>(col);

convert Collection into string as comma seperated in Java 8Java 8中将 Collection 转换为以逗号分隔的字符串

listOfString object contains ["A","B","C" ,"D"] elements- listOfString 对象包含 ["A","B","C" ,"D"] 元素-

listOfString.stream().map(ele->"'"+ele+"'").collect(Collectors.joining(","))

Output is :- 'A','B','C','D'输出是:- 'A','B','C','D'

And Convert Strings Array to List in Java 8并在 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(",");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM