15

我有toString()一个ArrayList.

将值复制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、17.05、18.29、18.29、19.16]

以下不起作用:

  • Arrays.asList()
  • 谷歌收藏Lists.newArrayList()

建议?

4

6 回答 6

27

将大括号去掉,拆分,(逗号和空格),最后将其提供给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(", "));

请注意,这将适用于您的特定情况,但并非在所有情况下都有效。例如,您可能有一个字符串列表,其中至少一个包含后续的逗号和空格。那么分裂就会失败。

于 2010-05-05T14:39:03.453 回答
3

一般来说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都是 type 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;
}

诚然,它不是单行的,但也不算太糟糕。

于 2010-05-05T14:43:12.223 回答
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());
于 2010-05-05T14:37:17.330 回答
0

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

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

Arrays.asList(...) ?
于 2010-05-05T14:46:58.493 回答
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() 之前删除引号和方括号。这应该会给你一个列表,你可以很容易地用它来创建一个新的 ArrayList。

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

于 2010-05-05T14:47:27.923 回答
0

“必须是一行”的要求几乎可以确保您将获得一些丑陋的链式 API 调用,除非您编写一个辅助方法来封装事物。

这有点难看,但类似于 dotnetnewbie 的方法:

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

它是即兴的,所以我相信可以清理一下。

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

于 2010-05-05T14:48:27.233 回答