繁体   English   中英

从文本文件 Java 中读取嵌入列表

[英]Read embedded lists from a text file Java

注意:这个问题已经过重新措辞,以更清楚地说明我需要什么帮助。

我在一个文本文件中有这个:

[[0.0, 0.0, 1], [32.0, 0.0, 1], [64.0, 0.0, 1], [96.0, 0.0, 1], [128.0, 0.0, 1]]

我通过执行以下操作将其作为字符串加载:

public void loadWorld()
{
    FileHandle path = Gdx.files.local("saves/tileList.txt");

    String tmpString = path.readString(null);
    List<String> tmpList = new ArrayList<String>(Arrays.asList(tmpString.split("],")));
    System.out.println(tmpString);

}

返回这个:

[[[0.0, 0.0, 1, [32.0, 0.0, 1, [64.0, 0.0, 1, [96.0, 0.0, 1, [128.0, 0.0, 1]]]

有什么办法可以将字符串转换为嵌入的字符串列表吗?

例如在加载文本后的python中,您可以使用ast.literal_eval(tmpString)

是否有我可以使用的 Java 等价物?

这是保存功能:

public void saveWorld()
{
    FileHandle path = Gdx.files.local("saves/tileList.txt");

    List<List<String>> tmpArray = new ArrayList<List<String>>();
    List<String> tmpList = new ArrayList<String>();

    for (Tile t: tiles)
    {
        tmpList = new ArrayList<String>();
        tmpList.add(String.valueOf(t.getX()));
        tmpList.add(String.valueOf(t.getY()));
        tmpList.add(String.valueOf(t.getType()));
        tmpArray.add(tmpList);
        path.writeString(String.valueOf(tmpArray) + "\n", false);
    }

    path = Gdx.files.local("saves/itemList.txt");
    tmpArray = new ArrayList<List<String>>();

    for (Item i: items)
    {
        tmpList = new ArrayList<String>();
        tmpList.add(String.valueOf(i.getX()));
        tmpList.add(String.valueOf(i.getY()));
        tmpList.add(String.valueOf(i.getType()));
        tmpList.add(String.valueOf(i.getIsCollected()));
        tmpArray.add(tmpList);
        path.writeString(String.valueOf(tmpArray), false);
    }

    path = Gdx.files.local("saves/spriteList.txt");
    tmpArray = new ArrayList<List<String>>();

    for (Sprite s: sprites)
    {
        tmpList = new ArrayList<String>();
        tmpList.add(String.valueOf(s.getX()));
        tmpList.add(String.valueOf(s.getY()));
        tmpList.add(String.valueOf(s.getHealth()));
        tmpList.add(String.valueOf(s.getMaxHealth()));
        tmpList.add(String.valueOf(s.getMana()));
        tmpList.add(String.valueOf(s.getMaxMana()));
        tmpList.add(String.valueOf(s.getSpeed()));
        tmpList.add(String.valueOf(s.getArmour()));
        tmpList.add(String.valueOf(s.getDamage()));
        tmpList.add(String.valueOf(s.getHealthRegenRate()));
        tmpList.add(String.valueOf(s.getManaRegenRate()));
        tmpArray.add(tmpList);
        path.writeString(String.valueOf(tmpArray), false);
    }

}

这是一个使用 Jackson 将嵌套列表序列化为 json 的示例:

import java.util.ArrayList;
import java.util.List;

class EmbeddedList
{
    private List<List<Double>> list = new ArrayList<>();
    public List<List<Double>> getList()
    {
        return list;
    }
}

和序列化器:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.databind.ObjectMapper;


public class EmbeddedListSerializer 
{


public static void main(String[] args) 
{
    EmbeddedList saveMe = new EmbeddedList();
    List<Double> firstList = new ArrayList<>();
    firstList.add(0.0);
    firstList.add(0.0);
    firstList.add(1d);

    List<Double> secondList = new ArrayList<>();
    secondList.add(32.0);
    secondList.add(0.0);
    secondList.add(1d);

    List<Double> thirdList = new ArrayList<>();
    thirdList.add(64.0);
    thirdList.add(0.0);
    thirdList.add(1d);

    saveMe.getList().add(firstList);
    saveMe.getList().add(secondList);
    saveMe.getList().add(thirdList);

    EmbeddedListSerializer serializer = new EmbeddedListSerializer();
    serializer.saveJson(saveMe);

    EmbeddedList loaded = serializer.loadJson();
    for( List<Double> subList : loaded.getList() )
    {
        for( Double d : subList )
        {
            System.out.println( d );
        }
    }
}

public void saveJson( EmbeddedList embeddedList )
{
    ObjectMapper mapper = new ObjectMapper();
    try 
    {
        String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(embeddedList);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("list.json"));
        PrintWriter out = new PrintWriter(outputStreamWriter);
        PrintWriter writer = new PrintWriter(out);
        writer.print(json);
        writer.close();

    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
}

private EmbeddedList loadJson()
{
    EmbeddedList list = null;
    try
    {
        ObjectMapper mapper = new ObjectMapper();
        File file = new File("list.json");
        list = mapper.readValue( file, EmbeddedList.class );
    }
    catch( IOException e )
    {
        e.printStackTrace();
    }
    return list;
}   

}

将数据存储为:

{
  "list" : [ [ 0.0, 0.0, 1.0 ], [ 32.0, 0.0, 1.0 ], [ 64.0, 0.0, 1.0 ] ]
}

如果需要,请将 EmbeddedList 对象中的 Double 更改为 Number,然后将 double 序列化为 double,将 int 序列化为 int。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM