5

我正在使用的toString方法ArrayListArrayList数据存储到字符串中。我的问题是,我该如何走另一条路?是否存在将String实例中的数据解析回的现有方法ArrayList

4

6 回答 6

8

最简洁的答案是不”。没有简单的方法可以从字符串重新导入对象,因为某些类型信息在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;
}

序列化形式重构对象通常称为反序列化

于 2009-10-05T07:00:20.570 回答
3

这是一个类似的问题:

Arrays.toString(int[]) 的反向(解析输出)

这取决于您在 ArrayList 中存储的内容,以及这些对象是否可以轻松地从它们的 String 表示中重建。

于 2009-10-05T06:48:17.017 回答
0

我建议使用一些标准格式和一个库来代替它。

JSON在语法上可能是最接近的。

或者,一些基于 XML 或序列化的解决方案也可以工作。当然,这一切都取决于您的需求。

于 2009-10-05T06:47:00.613 回答
0

ArrayList 由什么组成?正如其他人所说,在某些情况下这可能是不可能的,但如果

  • 可以明确识别数组元素的每个字符串表示形式(例如,如果 ArrayList 由Integers 组成)

  • 有一种方法可以从其 String 表示创建原始类型的对象。我发现使用静态方法执行此操作最优雅fromString

当然,这模仿了整个(反)序列化框架。

于 2009-10-05T10:42:54.520 回答
0

Apache Commons ftw。

Arrays.asList(StringUtils.split(StringUtils.substringBetween("[1, 2, 3]", "[", "]"), ", "))
于 2012-08-02T12:25:09.850 回答
0
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;
  }

如果上面给出了编译错误。(不能在 StringTokenizer 上使用 forEach)

于 2020-08-07T15:03:30.043 回答