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

我有一个ArrayListtoString()表示。

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

  • 我的ArrayList.toString()包含设置unit testing所需的数据。
  • 我想将此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] 

以下不起作用:

  • Arrays.asList()
  • 谷歌collectionsLists.newArrayList()

建议?

对大括号进行子串 , 将其拆分 , (逗号和空格),最后将其提供给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 list = Arrays.asList(s.substring(1, s.length() - 1).split(", ")); 

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

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

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

作为一个极端的例子,想想一个包含单个元素的ArrayList ,该元素是内容为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.16StringArrayList将生成与原始ArrayList完全相同的输出。 由于两个不同的输入产生相同的输出,如果没有附加信息,这个function就无法逆转。

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

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

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

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

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

我想将此ArrayList.toString()复制到我的编辑器中,以针对此边缘情况构建测试

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

 Arrays.asList(...) ? 

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

  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。

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

除非你编写一个帮助方法来封装东西,否则“必须是一行”的要求几乎可以确保你会得到一些丑陋的链式API调用。

它有点难看,但与dotnetnewbie的方法相似:

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

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

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