【问题标题】:Save state of List<Integer> [duplicate]保存 List<Integer> 的状态 [重复]
【发布时间】:2014-12-10 15:44:28
【问题描述】:

我创建了一个益智游戏,可以在其中打乱拼图以重新创建图像。该应用程序几乎完成,除了我保存数据的部分,以便在重新启动应用程序时可以继续游戏。我找到了一些关于 SharedPreferences 的信息,但我知道无法用它保存列表。我有一个包含拼图索引的整数列表,需要保存。我尝试将 List 转换为字符串并检索它,但它变坏了并弄乱了我的整个程序。我不够熟练,无法修复它,所以我与您联系。因此,我的问题是,如何保存我的整数列表?

如果之前有人问过这个问题,请提前道歉,我已经在互联网上查找了两个多小时,我真的需要一些帮助。 :)

【问题讨论】:

  • 使用 csv 字符串,保存它,然后在恢复时使用逗号将字符串拆分为适当的整数。
  • 我试过这个,但我的程序在尝试访问新创建的列表时抛出了错误。

标签: java android


【解决方案1】:

正确的做法是转换成String,然后放入SharedPreferences。您可以像这样将List 转换为String

public static String listIntToString(List<Integer> list) {
    StringBuilder s = new StringBuilder();
    for (int i: list)
        s.append(i).append(" ");
    return s.toString();
}

现在回到List&lt;Integer&gt;

public static List<Integer> stringToListInt(String s) {
    List<Integer> result = new ArrayList<>();
    Scanner scan = new Scanner(s);
    while (scan.hasNextInt())
        result.add(scan.nextInt());
    scan.close();
    return result;
}

这比为了这么简单的事情搞乱文件、数据库或 XML 要干净得多。


其实如果你想变得可爱,那么你可以使用它的.toString() 方法将List&lt;Integer&gt; 转换为String,然后使用它返回到List&lt;Integer&gt;

public static List<Integer> defaultStringToListInt(String s) {
    List<Integer> result = new ArrayList<>();
    Scanner scan = new Scanner(s);
    scan.useDelimiter(Pattern.compile("[, \\[\\]]+"));
    while (scan.hasNextInt())
        result.add(scan.nextInt());
    scan.close();
    return result;
}

这样,您只需要定义一个辅助方法。这是因为List&lt;Integer&gt; 上的.toString() 方法的结果类似于

[1, 22, -3, 4, 5]

上面的代码通过查找整数进行扫描,使用方括号、逗号和空格作为分隔符。

【讨论】:

  • 我试过这个,但是它抛出了一个 NullPointerException “试图获取空数组的长度”,所以我做错了什么,但是什么?
  • @Nifty 在哪一行?我给你的代码没有使用任何数组...
  • 你说得对,是我做错了。我现在正在修复它,希望它有效,不过感谢您的回答!我想这就是我想要的:)
  • 更新:这对我来说非常有效!
【解决方案2】:

您可以使用数据库来存储应用重新启动时将检索的信息,或者(可能是更简单的方法)将整数列表保存到文件中,并在应用重新启动时从中读取。

【讨论】:

  • 那么首选什么方法呢?我发现很难做出选择,因为我不熟悉其中之一。
  • 我会使用保存到文件的方法。
  • 其实我收回了。阅读有关 SQLite 的信息。这可能是更好的方法
【解决方案3】:

我建议创建一个 XML,然后在每次应用启动时读取它以收集数据。您可以执行以下操作来编写您的 XML;

// Create your document and it's root element.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element root = doc.createElement("root");
doc.appendChild(root);
// Loop through your list and create an xml element for each list element.
for(Integer i : yourList){
     Element listItem = doc.createElement("integer");       
     listItem.setAttribute("value", i.toString());
     root.appendChild(listItem);
}
// write the the Document to where-ever you want.
FileOutputStream fos = yourContext.openFileOutput("data_store.xml", Context.MODE_PRIVATE);
TransformerFactory factory = new TransformerFactory();
Transformer transformer = factory.newTransformer();
DOMSource source = new DOMSource(root);
StreamResult result = new StreamResult(fos);
transformer(source, result);

并简单地阅读您的 XML;

FileInputStream fis = yourContext.openFileInput("data_store.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(fis);
// Get & loop through a list of all integer elements
NodeList nodes = doc.getElementsByTagName("integer");
for(Node n : nodes){
    if(n.getNodeType() == Node.ELEMENT_NODE){
        Element e = (Element) n;
        yourList.add(Integer.parseInt(e.getAttribute("value")));
    }        
}

虽然上面的内容有点矫枉过正,但您可能会发现自己想要存储其他相关的详细信息,在这种情况下,此解决方案的可扩展性要高得多。我希望这会有所帮助。

进一步阅读;

【讨论】:

    猜你喜欢
    • 2014-01-03
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2011-08-28
    • 2015-05-29
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多