【问题标题】:How to convert an arrayList.toString() into an actual arraylist如何将 arrayList.toString() 转换为实际的 arraylist
【发布时间】:2022-01-14 11:17:40
【问题描述】:

在我的软件中,由于SQLite 中没有Array 数据类型,我将ArrayList 保存为String。现在我需要使用我的数组并将其转换回 ArrayList。我该怎么做?

这里是一个例子:

ArrayList<String> list = new ArrayList<String>();
list.add("name1");
list.add("name2");
list.add("name3");
list.add("name4");
list.add("name5");
list.add("name6");

String newList = list.toString();
System.out.println(newList);

结果:[name1, name2, name3, name4, name5, name6]

那么现在我怎样才能将其转换为ArrayList&lt;String&gt;

【问题讨论】:

  • 我认为你不想使用toString,而是使用toArray
  • 将在 sql 中列为 blob 是一个不好的选择吗?
  • 如果您的任何字符串包含逗号,则 toString() 转换是有损的,并且没有简单可靠的方法来恢复原始数组。
  • 您应该小心使用toString() 进行序列化。如果您将"firstname, lastname" 添加到您的列表中,则无法知道是否应该将其反序列化为["firstname, lastname"]["firstname", "lastname"],因为toString() 将为两者输出"[firstname, lastname]"
  • 有点,你有一个表用于你的主要对象(那些包含列表的对象),一个包含所有列表中的所有项目作为单独的行。第二个表中的每一行都包含对第一个表中存储其拥有对象的行的引用(如果顺序很重要,它是列表中的索引)。要重新组装对象,您首先从第一个表中加载对象,然后从第二个表中加载它的所有列表项。

标签: java arrays arraylist


【解决方案1】:

我相信这应该可行:

Arrays.asList(newList.substring(1, newList.length() - 1).replaceAll("\\s", "").split(","));
  • 取字符串,去掉第一个和最后一个括号。
  • 删除每个空格。
  • 以逗号分隔作为分隔符,作为列表收集。

请注意,如果您确实必须为项目执行此操作,那么您的代码设计中就有问题。但是,如果这只是出于好奇的目的,那么此解决方案将起作用。


测试后

ArrayList<String> list = new ArrayList<String>();
list.add("name1");
list.add("name2");
list.add("name3");
list.add("name4");
list.add("name5");
list.add("name6");

String newList = list.toString();                
List<String> myList = Arrays.asList(newList.substring(1, newList.length() - 1).replaceAll("\\s", "").split(","));

System.out.println(myList);

会正确编译并打印:

[name1, name2, name3, name4, name5, name6]

编辑

根据您的 cmets,如果您真的希望您的变量成为 ArrayList&lt;String&gt; 实例,那么您可以将列表传递给 ArrayList 构造函数:

ArrayList<String> myList = new ArrayList(Arrays.asList(newList.substring(1, newList.length() - 1).replaceAll("\\s", "").split(",")));

您不能直接转换为Arrays.asList 使用它自己的内置java.util.Arrays$ArrayList 类。

【讨论】:

  • 感谢您的回答。如何将输出作为 ArrayList
  • @user2357112 回滚到我以前的版本。实际上,当看到另一个答案时,我认为它允许这种可能性,但显然不是这样。
【解决方案2】:

那么只接受字符串的方法是否能够添加这样的情况?

methodThatOnlyAllowsStrings((Object)list);

【讨论】:

    【解决方案3】:

    这不可能没有歧义。考虑:

    ArrayList<String> list = new ArrayList<String>();
    list.add("name1, name2");
    list.add("name3, name4");
    list.add("name5");
    list.add("name6");
    
    String newList = list.toString();
    System.out.println(newList);
    
    Result: [name1, name2, name3, name4, name5, name6]
    

    为了在一般情况下准确恢复原始元素,您的字符串格式必须比ArrayList.toString() 更智能。考虑一种对字符串列表进行编码的预定义方式,可能是 JSON 数组,对于我的示例,这将产生类似这样的结果:

    ["name1, name2", "name3, name4", "name5", "name6"]
    

    JSON 还定义了如何通过转义和/或使用备用字符串开始/结束字符 '" 来处理带引号的字符串:

    ["he said, 'hello'", 'she said, "goodbye"', 'I said, "it\'s raining"']
    

    (我也同意其他评论者的观点,即应该重新考虑您的数据库设计,但我想提供一个明确的答案来说明列表的字符串编码问题。)

    【讨论】:

    • 确实感谢。这是个好主意。我猜 Google 的 GSON 可以做到这一点。我很感激。
    猜你喜欢
    • 2011-02-15
    • 2011-03-28
    • 2016-08-27
    • 2011-08-20
    • 2016-10-23
    • 2022-01-19
    • 2021-02-21
    相关资源
    最近更新 更多