У меня есть a toString()
представление ArrayList
.
Копирование toString()
оцените буферу обмена, я хочу скопировать его назад в моего редактора IDE и создать ArrayList
экземпляр в одной строке. На самом деле то, что я действительно делаю, является этим:
Мой вход похож на это:
[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()
Предложения?
Подстрока , скобки разделены на ,
(запятая и пробел) и, наконец, переданы в 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(", "));
Обратите внимание, что это сработает в вашем конкретном случае, но не во всех обстоятельствах. Например, у вас может быть список строк, из которых хотя бы одна содержит запятую и пробел. Тогда раскол потерпит неудачу.
Я хочу скопировать этот ArrayList.toString() в мой редактор, чтобы чтобы создать тест против этого крайнего случая
Если вы вообще копируете, не можете ли вы просто скопировать значения без квадратных скобок и вызвать
Arrays.asList(...) ?
это работает, но, возможно, у кого-то есть что-то более элегантное?
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());
Если вы просто ищете решение для копирования и вставки,
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.
Если данные сложнее двойников, возможно, вам придется найти способ их проанализировать.
Вообще говоря, 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;
}
Конечно, это не однострочник, но и не так уж плохо.
Требование «должна быть одна строка» в значительной степени гарантирует, что вы получите некоторую уродливую путаницу связанных вызовов API, если вы не напишете вспомогательный метод для инкапсулируйте вещи.
Это некрасиво, но похоже на подход dotnetnewbie:
List<String> result = Arrays.asList(listString.substring(1, listString.length()-1).split(",\\s*"));
Это неуместно, поэтому я уверен, что это можно исправить.
Более элегантный и легкий для чтения подход определенно заключался бы в том, чтобы либо разбить его на пару строк, либо выполнить рефакторинг до вспомогательного метода в вашем тестовом примере (или классе Util), который вы можете вызвать со своей строкой и получить его. верните желаемый результат.