在一次调用中将ArrayList.toString()转换回ArrayList
我有一个ArrayList
的toString()
表示。
将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()
- 谷歌collections
Lists.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.16
的String
。 ArrayList
将生成与原始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类)中的辅助方法,你可以使用字符串调用它并让它返回输出你想要的。