保存List <integer> </integer>的状态

时间:2014-12-10 15:44:29

标签: java android

我创建了一个益智游戏,其中可以对切片进行洗牌以重新创建图像。该应用程序几乎已完成,除了我保存数据的部分,以便在重新启动应用程序时可以继续游戏。我找到了一些有关SharedPreferences的信息,但我知道无法用它保存List。我有一个整数列表,其中包含拼图的索引,需要保存。我尝试将List转换为字符串并检索它,但它变坏了并搞砸了我的整个程序。我没有足够的技能来解决它​​,所以我正在联系你。因此,我的问题是,如何保存整数列表?

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

3 个答案:

答案 0 :(得分: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<Integer>

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更简洁。


实际上,如果你想变得可爱,那么你可以使用List<Integer>方法将String转换为.toString(),然后使用它来回到{{1} }:

List<Integer>

这样,您只需要定义一个辅助方法。这是有效的,因为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; } 上的.toString()方法与

类似
List<Integer>

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我建议创建一个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")));
    }        
}

虽然上面的内容有点过分,但您可能会发现自己想要存储其他相关细节,在这种情况下,此解决方案更具可扩展性。我希望这会有所帮助。

进一步阅读;