我有一个toString()
的{{1}}代表。
将ArrayList
值复制到剪贴板,我想将其复制回IDE编辑器,并在一行中创建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
Arrays.asList()
建议?
答案 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.16
。 ArrayList
将生成与原始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类)中的辅助方法并拥有它返回你想要的输出。