在一次调用中将ArrayList.toString()转换回ArrayList

时间:2010-05-05 14:33:56

标签: java collections arraylist tostring

我有一个toString()的{​​{1}}代表。

ArrayList值复制到剪贴板,我想将其复制回IDE编辑器,并在一行中创建toString()实例。事实上,我真正在做的是:

  • 我的ArrayList.toString()包含设置单元测试所需的数据。
  • 我想将此ArrayList.toString()复制到我的编辑器中,以针对此边缘情况构建测试
  • 我不想手工解析任何东西

我的输入如下:

[15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16]

以下不起作用:

  • ArrayList
  • google collections Arrays.asList()

建议?

6 个答案:

答案 0 :(得分:22)

Substring大括号,split,(逗号和空格)上,最后将其提供给Arrays#asList()

 String s = "[15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16]";
 List<String> list = Arrays.asList(s.substring(1, s.length() - 1).split(", "));

请注意,这将适用于您的特定情况,但不适用于所有情况。例如,您可以拥有一个字符串列表,其中至少有一个字符串包含后续逗号和空格。分裂将失败。

答案 1 :(得分:2)

一般来说,任何对象的toString()都不包含在没有任何进一步信息的情况下重现原始对象的信息。

在您的特定情况下,该示例可以由许多不同的ArrayList实例(以及几乎所有具有相同List个实现的toString()实现)生成。

作为一个极端的例子,请考虑ArrayList包含单个元素,即String,内容为15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16ArrayList将生成与原始ArrayList完全相同的输出。由于两个不同的输入产生相同的输出,如果没有其他信息,这个功能就无法逆转。

但是,如果我们有其他信息,例如原始ArrayList的内容类型,那么在某些情况下就可以了。如果我们知道List的所有元素都属于Double类型,那么它实际上非常简单:

public static List<Double> stringToList(final String input) {
    String[] elements = input.substring(1, input.length() - 1).split(", ");
    List<Double> result = new ArrayList<Double>(elements.length);
    for (String item : elements) {
        result.add(Double.valueOf(item));
    }
    return result;
}

当然,这不是一个单行,但它并不太糟糕。

答案 2 :(得分:1)

这可行,但也许某人有更优雅的东西?

    List<String> list = Lists.newArrayList(Splitter.on(",").omitEmptyStrings().split("JUN10, SEP10, DEC10, MAR11, JUN11, SEP11, DEC11, MAR12, JUN12, SEP12, DEC12, MAR13, DEC13, DEC14"));
    assertEquals(14, list.size());

答案 3 :(得分:0)

  

我想复制这个   ArrayList.toString()进入我的编辑器   针对此边缘案例构建测试

如果您正在复制,则不能只复制省略方括号的值并调用

Arrays.asList(...) ?

答案 4 :(得分:0)

如果您只是在寻找复制粘贴解决方案,

    Arrays.asList(15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16);

即。在尝试将其放入asList()之前删除引号和方括号。这应该为您提供一个List,您可以轻松地使用它创建一个新的ArrayList。

如果数据比双打更复杂,您可能必须找到解析它们的方法。

答案 5 :(得分:0)

“必须是一行”的要求几乎可以确保您将获得一些丑陋的链接API调用,除非您编写一个帮助方法来封装内容。

这有点难看,但与dotnetnewbie的做法类似:

List<String> result = Arrays.asList(listString.substring(1, listString.length()-1).split(",\\s*"));

它脱离了袖口,所以我确信可以清理一下。

一个更优雅,更容易阅读的方法肯定是要在几行中分解它,或者重构一个你可以用你的字符串调用的测试用例(或一个Util类)中的辅助方法并拥有它返回你想要的输出。