Что является обратной стороной (ArrayList).toString для Java ArrayList?

Я использую метод toString ArrayList для хранения данных ArrayList в строке. У меня вопрос, как мне пойти другим путем? Существует ли существующий метод, который будет анализировать данные в экземпляре String обратно в ArrayList?


person user174772    schedule 05.10.2009    source источник
comment
Обратите внимание, что если элементы списка не являются строковыми объектами, то обратное действие может оказаться невозможным, потому что theList.toString() вызовет toString() для всех элементов, и это может быть или не быть обратимым действием (т. е. представление String может не содержать всю необходимую информацию). воспроизвести исходный объект).   -  person Joachim Sauer    schedule 05.10.2009


Ответы (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;
}

Восстановление объектов из их сериализованной формы обычно называется десериализацией.

person levik    schedule 05.10.2009
comment
В этом случае я использовал строки, поэтому я думаю, что разобрать их самостоятельно достаточно просто. Спасибо. - person user174772; 05.10.2009
comment
Конечно, это будет работать только в том случае, если строки сами по себе не содержат запятых, что является первым пунктом в моем ответе. - person Miserable Variable; 05.10.2009
comment
Лично я бы создал для этого класс кодеков, чтобы можно было параметризовать класс (позже) и проверять конкретные хорошие/плохие кодировки. - person Maarten Bodewes; 25.10.2014
comment
Что, если моя строка в arraylist содержит ','? - person Salmaan; 12.12.2014

Вот аналогичный вопрос:

Обратный (анализ вывода) Arrays.toString(int[])

Это зависит от того, что вы храните в ArrayList, и от того, легко ли реконструируются эти объекты из их строковых представлений.

person rledley    schedule 05.10.2009

Вместо этого я бы рекомендовал использовать какой-то стандартный формат с библиотекой.

JSON, вероятно, ближе всего синтаксически.

В качестве альтернативы может работать какое-то решение на основе XML или сериализации. Все зависит от ваших потребностей, конечно.

person iny    schedule 05.10.2009
comment
Формат List.toString() сильно отличается от JSON. На самом деле это очень просто (и гораздо менее мощно). Использование библиотеки JSON является излишним (и, вероятно, просто неправильным). - person Joachim Sauer; 05.10.2009
comment
Внедрение собственного глючного парсера просто неправильно. Всегда лучше использовать проверенную библиотеку. - person iny; 05.10.2009

Из чего состоит ArrayList? Как говорили другие, в некоторых случаях это может быть невозможно, но вполне возможно и гарантированно сработает, если:

  • каждое строковое представление элемента массива может быть однозначно идентифицировано (как это может быть, например, если ArrayList состоит из Integers)

  • есть способ создать объект исходного типа из его строкового представления. Я считаю наиболее элегантным сделать это с помощью статического метода fromString

Конечно, это имитирует всю структуру (де)сериализации.

person Miserable Variable    schedule 05.10.2009

Apache Commons ftw.

Arrays.asList(StringUtils.split(StringUtils.substringBetween("[1, 2, 3]", "[", "]"), ", "))
person Pyrolistical    schedule 02.08.2012

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)

person Arkadeep Basu    schedule 07.08.2020