Я использую метод toString
ArrayList
для хранения данных ArrayList
в строке. У меня вопрос, как мне пойти другим путем? Существует ли существующий метод, который будет анализировать данные в экземпляре String
обратно в ArrayList
?
Что является обратной стороной (ArrayList).toString для Java ArrayList?
Ответы (6)
Короткий ответ - нет". Не существует простого способа повторного импорта объекта из строки, поскольку определенная информация о типе теряется при сериализации toString()
.
Однако для определенных форматов и определенных (известных) типов вы должны иметь возможность написать код для разбора строки вручную:
// Takes Strings like "[a, b, c]"
public List parse(String s) {
List output = new ArrayList();
String listString = s.substring(1, s.length() - 1); // chop off brackets
for (String token : new StringTokenizer(listString, ",")) {
output.add(token.trim());
}
return output;
}
Восстановление объектов из их сериализованной формы обычно называется десериализацией.
Вот аналогичный вопрос:
Обратный (анализ вывода) Arrays.toString(int[])
Это зависит от того, что вы храните в ArrayList, и от того, легко ли реконструируются эти объекты из их строковых представлений.
Вместо этого я бы рекомендовал использовать какой-то стандартный формат с библиотекой.
JSON, вероятно, ближе всего синтаксически.
В качестве альтернативы может работать какое-то решение на основе XML или сериализации. Все зависит от ваших потребностей, конечно.
Из чего состоит ArrayList? Как говорили другие, в некоторых случаях это может быть невозможно, но вполне возможно и гарантированно сработает, если:
каждое строковое представление элемента массива может быть однозначно идентифицировано (как это может быть, например, если ArrayList состоит из
Integer
s)есть способ создать объект исходного типа из его строкового представления. Я считаю наиболее элегантным сделать это с помощью статического метода
fromString
Конечно, это имитирует всю структуру (де)сериализации.
Apache Commons ftw.
Arrays.asList(StringUtils.split(StringUtils.substringBetween("[1, 2, 3]", "[", "]"), ", "))
private List<String> parseStringToList(String column) {
List<String> output = new ArrayList<>();
String listString = column.substring(1, column.length() - 1);
StringTokenizer stringTokenizer = new StringTokenizer(listString,",");
while (stringTokenizer.hasMoreTokens()){
output.add(stringTokenizer.nextToken());
}
return output;
}
В случае, если приведенное выше дает ошибку компиляции. (Невозможно использовать forEach для StringTokenizer)
theList.toString()
вызоветtoString()
для всех элементов, и это может быть или не быть обратимым действием (т. е. представление String может не содержать всю необходимую информацию). воспроизвести исходный объект). - person Joachim Sauer   schedule 05.10.2009