преобразуйте ArrayList.toString () назад к ArrayList в одном вызове

У меня есть a 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()
  • наборы Google Lists.newArrayList()

Предложения?

10
задан BalusC 5 May 2010 в 14:37
поделиться

6 ответов

Подстрока , скобки разделены на , (запятая и пробел) и, наконец, переданы в 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(", "));

Обратите внимание, что это сработает в вашем конкретном случае, но не во всех обстоятельствах. Например, у вас может быть список строк, из которых хотя бы одна содержит запятую и пробел. Тогда раскол потерпит неудачу.

24
ответ дан 3 December 2019 в 15:51
поделиться

Я хочу скопировать этот ArrayList.toString() в мой редактор, чтобы чтобы создать тест против этого крайнего случая

Если вы вообще копируете, не можете ли вы просто скопировать значения без квадратных скобок и вызвать

Arrays.asList(...) ?
0
ответ дан 3 December 2019 в 15:51
поделиться

это работает, но, возможно, у кого-то есть что-то более элегантное?

    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());
1
ответ дан 3 December 2019 в 15:51
поделиться

Если вы просто ищете решение для копирования и вставки,

    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.

Если данные сложнее двойников, возможно, вам придется найти способ их проанализировать.

0
ответ дан 3 December 2019 в 15:51
поделиться

Вообще говоря, 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
ответ дан 3 December 2019 в 15:51
поделиться

Требование «должна быть одна строка» в значительной степени гарантирует, что вы получите некоторую уродливую путаницу связанных вызовов API, если вы не напишете вспомогательный метод для инкапсулируйте вещи.

Это некрасиво, но похоже на подход dotnetnewbie:

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

Это неуместно, поэтому я уверен, что это можно исправить.

Более элегантный и легкий для чтения подход определенно заключался бы в том, чтобы либо разбить его на пару строк, либо выполнить рефакторинг до вспомогательного метода в вашем тестовом примере (или классе Util), который вы можете вызвать со своей строкой и получить его. верните желаемый результат.

0
ответ дан 3 December 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: