将列表的字符串表示形式转换为Java中的列表

时间:2019-01-15 12:11:45

标签: java

是否有简单,简单(不太复杂)的一行?

如果我们有List<String> li1 = Arrays.asList("a","b");,则li1.toString()将产生[a, b]。那么如何将字符串[a, b]转换为字符串列表?

与此相关的一个问题是,为什么生成的字符串不是["a","b"]?因为从字符串表示形式中我们无法区分Arrays.asList("1","2","3")Arrays.asList(1,2,3)。而且也不可能用。杰克逊(Jackson)和objectMapper.readValue(li1.toString(), String[].class);,那就是那一行解决方案。

4 个答案:

答案 0 :(得分:3)

  

那么如何将字符串[a,b]转换为字符串列表?

不是为了这个目的。

  

与此相关的问题是,为什么生成的字符串不是[“ a”,“ b”]?因为从字符串表示形式中我们无法将Arrays.asList(“ 1”,“ 2”,“ 3”)与Arrays.asList(1,2,3)区分开。

这可能与以下内容有关:Arrays.toString()仅使用,分隔符将项目的字符串表示形式串联起来,并在其周围放置[]。因此,真正的答案是“因为字符串"1"和整数1具有相同的表示形式”。再次,这与以下事实有关:两者都应可以原样打印。例如,Python区分__str__()__repr()__,Java只有.toString()

但是由于.toString()输出(除某些特殊情况外)仅用于调试,因此没有关系。

  

而且也不可能用。杰克逊(Jackson)与objectMapper.readValue(li1.toString(),String []。class);,这就是那一行解决方案。

如果您要这样做,还有其他更适合序列化和反序列化的解决方案。

序列化格式为

  • 二进制
  • XML
  • JSON

所有这些都是由一对明确的序列化数据创建和反序列化组成的,它们的作用相反。

答案 1 :(得分:0)

正如另一个答案所建议的那样,这样做不是一个好主意。但是仍然要回答您的问题:

  

如何将字符串[a,b]转换为字符串列表?

String s = "[a, b]";

//remove first and last character and create array of Strings splitting around the character ','
String[] strings = s.substring(1, s.length() - 1).split(",");

//Now since every element except the first one has an extra leading space, remove it
for (int i = 1; i < strings.length; i++) {
    strings[i] = strings[i].substring(1);
}

List<String> list = Arrays.asList(strings);
System.out.println(list);

请注意,如果列表中的一个字符串包含逗号,则此命令将不起作用,但是无法处理这种情况。


或者您可以使用org.springframework.util.StringUtils.commaDelimitedListToStringArray,但它将保留前导空格。

答案 2 :(得分:0)

请勿使用toString进行序列化/反序列化。

相反,您应该将其转换为字符串,如下所示:

 String str = objectMapper.writeValueAsString(list);

// To convert it back into string array

objectMapper.readValue(str, String[].class);

答案 3 :(得分:0)

有一些方法可以做到,但我认为没有任何方法可以直接实现它。 而且,在尝试处理toString()时也不是一个好主意(例如,可以覆盖它)。

一种可能的解决方案如下:

public static List<String> getListFromListStringArray(String inString){
    List<String> returnList = null;

    System.out.println("in: " + inString);

    /*
     * Will remove leading and trailing [ ]
     * [a, b] => a, b 
     */
    inString = inString.replaceAll("[\\[\\]]", "");
    /* 
     * Will create List from String array by delimiter (, ) in this case 
     */
    returnList = Arrays.asList(inString.split(", "));
    //[a, b]
    System.out.println(returnList.toString());

    return returnList;
}