Java 在一次调用中将ArrayList.toString()转换回ArrayList
我有一个Java 在一次调用中将ArrayList.toString()转换回ArrayList,java,collections,arraylist,tostring,Java,Collections,Arraylist,Tostring,我有一个toString()表示的ArrayList 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(", ")); 将toString
toString()
表示的ArrayList
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(", "));
将toString()
值复制到剪贴板,我想将其复制回IDE编辑器,并在一行中创建ArrayList
实例。事实上,我真正做的是:
- 我的ArrayList.toString()中有设置单元测试所需的数据
- 我想将此ArrayList.toString()复制到我的编辑器中,以针对此边缘情况构建测试
- 我不想手工解析任何东西
Arrays.asList()
- 谷歌收藏
list.newArrayList()
建议?这很有效,但也许有人有更优雅的东西
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());
List List=Lists.newArrayList(Splitter.on(“,”).ommiteEmptyStrings().split(“JUN10,SEP10,DEC10,MAR11,JUN11,SEP11,DEC11,MAR12,JUN12,SEP12,DEC12,MAR13,DEC14”);
assertEquals(14,list.size());
将大括号分开,将其置于,
(逗号和空格),最后将其馈送到数组#asList()
String s=“[15.82,15.870000000000001,15.92,16.32,16.32,16.32,16.32,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
实例(以及几乎所有其他List
实现产生,它们具有相同的toString()
)实现
作为一个极端的例子,请考虑一个ArrayList
,它包含一个元素,即字符串,其内容为15.82、15.870000000000001、15.92、16.32、16.32、16.32、17.05、17.05、17.05、17.05、18.29、18.29、19.16
。该ArrayList
将产生与原始ArrayList
完全相同的输出。由于两个不同的输入产生相同的输出,没有额外的信息,这个函数是不可能反转的
但是,如果我们有额外的信息,例如原始ArrayList
的内容类型,那么在某些情况下它是可能的。如果我们知道列表的所有元素都是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;
}
公共静态列表字符串列表(最终字符串输入){
String[]elements=input.substring(1,input.length()-1);
列表结果=新的ArrayList(elements.length);
用于(字符串项:元素){
结果.添加(项目的双值);
}
返回结果;
}
当然,这不是一条直线,但也不算太糟
我想复制这个
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);
i、 e.删除引号和方括号,然后再将其放入asList()。这将为您提供一个列表,您可以轻松使用该列表创建新的ArrayList
如果数据比double更复杂,您可能必须找到一种方法来解析它们。必须是一行”的要求几乎可以确保您将得到一些糟糕的链式API调用,除非您编写一个助手方法来封装这些东西
这有点难看,但与dotnetnewbie的方法类似:
List<String> result = Arrays.asList(listString.substring(1, listString.length()-1).split(",\\s*"));
List result=Arrays.asList(listString.substring(1,listString.length()-1).split(“,\\s*”);
这是即兴的,所以我相信可以稍微整理一下
一种更优雅、更容易阅读的方法肯定是,在测试用例(或Util类)中,通过几行将其分解,或者重构为一个助手方法,您可以使用字符串调用该方法,并让它返回您想要的输出。您能详细说明为什么使用Arrays.asList吗(15.82,15.870000000000001,15.92,16.32,16.32,16.32,16.32,17.05,17.05,17.05,18.29,18.29,19.16)无法为您提供正确的列表?我随意选择了一个。很抱歉,这是对的。我的测试用例列表是字符串:“[x,y,z]”必须从ArrayList的开头和结尾移除括号。toString()看起来您使用的是来自guava Libraries的Splotter sp.S.数据是数据的单数形式。嗨,ILMTitan,我喜欢这样,但是当列表包含字符串元素时,它不起作用,例如“[x,y,z]”我想您需要S.length()-1,由于endIndex中的字符不包含在子字符串中,这只是个人喜好的问题,但我更喜欢不解析,更喜欢google splitter解决方案。您的选择。我只是想证明它是有效的。您提到它“不起作用”.既然您已经提前使用Google Collections给出了答案,我不想浪费时间来复制它。谢谢。我只是想澄清一下-我在寻找阻力最小/最快的路径,因为我只需要单元测试的数据。我同意我本来可以做的…但我真的想知道如何复制ArrayList.ToStringg()直接进入我的测试用例,让它工作,不需要额外的mod。我在发布.thx againThanx BalusC后一分钟出现时添加了我的google coll解决方案,这非常有帮助。是的,我修改了。对不起。数字类型的值工作正常;但是当你的列表
List<String> result = Arrays.asList(listString.substring(1, listString.length()-1).split(",\\s*"));