преобразовать ArrayList.toString () обратно в ArrayList за один вызов - PullRequest
9 голосов
/ 05 мая 2010

У меня есть 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()

Предложения

Ответы [ 6 ]

23 голосов
/ 05 мая 2010

Подстрока скобки, 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(", "));

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

2 голосов
/ 05 мая 2010

Вообще говоря, 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;
}

Конечно, это не однострочник, но не так уж и плохо.

1 голос
/ 05 мая 2010

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

    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());
0 голосов
/ 05 мая 2010

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

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

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

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

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

0 голосов
/ 05 мая 2010

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

    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 голосов
/ 05 мая 2010

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

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

Arrays.asList(...) ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...