【问题标题】:What is the reverse of (ArrayList).toString for a Java ArrayList?Java ArrayList 的 (ArrayList).toString 的反面是什么?
【发布时间】:2010-12-03 20:41:41
【问题描述】:

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

【问题讨论】:

  • 请注意,如果 List 的元素不是 String 对象,则可能无法执行反向操作,因为 theList.toString() 将在所有元素上调用 toString() 并且这可能是也可能不是可逆的操作(即字符串表示可能不包含复制原始对象所需的所有信息)。

标签: java string arraylist encoding tostring


【解决方案1】:

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

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

【讨论】:

  • 在这种情况下,我使用的是字符串,所以我想自己解析它很简单。谢谢。
  • 当然,这只有在字符串本身不包含逗号字符时才有效,这是我回复的第一点。
  • 我个人会为此创建一个 Codec 类,因此可以参数化该类(稍后)并检查特定的好/坏编码。
  • 如果我的arraylist中的字符串包含','怎么办?
【解决方案2】:

这是一个类似的问题:

Reverse (parse the output) of Arrays.toString(int[])

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

【讨论】:

    【解决方案3】:

    我建议使用一些带有库的标准格式。

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

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

    【讨论】:

    • List.toString() 格式与 JSON 完全不同。事实上,它很简单(而且功能也没有那么强大)。使用 JSON 库是多余的(而且可能是错误的)。
    • 实现自己的错误解析器是错误的。总是使用经过测试的库要好得多。
    【解决方案4】:

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

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

    • 有一种方法可以从其 String 表示创建原始类型的对象。我发现使用静态方法fromString

    • 这样做最优雅

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

    【讨论】:

      【解决方案5】:

      Apache Commons ftw。

      Arrays.asList(StringUtils.split(StringUtils.substringBetween("[1, 2, 3]", "[", "]"), ", "))
      

      【讨论】:

        【解决方案6】:
        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)

        【讨论】:

          猜你喜欢
          • 2016-08-03
          • 1970-01-01
          • 2011-04-27
          • 2014-05-04
          • 1970-01-01
          • 2012-06-01
          • 2013-09-02
          • 2015-05-08
          • 2012-01-12
          相关资源
          最近更新 更多