Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一次调用中将ArrayList.toString()转换回ArrayList_Java_Collections_Arraylist_Tostring - Fatal编程技术网

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()复制到我的编辑器中,以针对此边缘情况构建测试
  • 我不想手工解析任何东西
我的输入如下所示:

[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]

以下各项不起作用:

  • 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*"));