【问题标题】:Save BooleanArray in LibgGDX Preferences在 LibgGDX 首选项中保存 BooleanArray
【发布时间】:2018-08-10 01:46:28
【问题描述】:

我在我的 LibgGDX 游戏中有一个很长的BooleanArray,将其保存在我的Preferences 中,我这样做:

static Preferences prefs;

public static void putMyArray (BooleanArray booleanArray, String string){
    for(int i=0; i < booleanArray.size;i++){
        prefs.putBoolean( string+i, booleanArray.get(i));
    }
}

此方法适用于小型数组,但在我的情况下,大小为 100+。

请帮忙,还有其他方法吗?

【问题讨论】:

    标签: java android arrays libgdx sharedpreferences


    【解决方案1】:

    如果您希望它超级紧凑,可以使用 Kryo 库将其转换为二进制文件。然后,如果您使用 ByteArrayOutputStream,您可以将其保存为本地文件或将其转换为字符串首选项。

    Kryo 中已经有一个library with serializers for LibGDX 数据类。

    将库添加到 build.gradle 中的核心项目:

    compile "com.cyphercove.gdx:gdxtokryo:1.1.1"
    

    保存到文件:

    kryo = new Kryo();
    kryo.setRegistrationRequired(true);
    GdxToKryo.registerGroup(kryo, 0);
    Output output = new Output(Gdx.files.local("mySave.bin").write(false));
    kryo.writeObject(output, myBooleanArray);
    output.close();
    

    读取数据:

    kryo = new Kryo();
    kryo.setRegistrationRequired(true);
    GdxToKryo.registerGroup(kryo, 0);
    Input input = new Input(Gdx.files.local("mySave.bin").read());
    BooleanArray myBooleanArray = kryo.readObject(input, BooleanArray.class);
    input.close();
    

    【讨论】:

    • 谢谢你并支持@Tenfour04,有没有其他方法没有库
    • 写入 ByteArrayOutputStream。将其输出到具有特定编码的字符串,以便您可以将其保存为字符串首选项,或将其直接写入本地文件。
    【解决方案2】:

    我建议你使用java的BitSet。(它的核心java库)BitSet

    BitSet 有两个原因。

    • BitSet 有 toLongArray() 方法。(反之亦然 valueOf(long[] longs) )

    您可以将位转换为长类型并存储为长。

    • Java 的布尔数组不太好用。

    Hidden evils of Java’s boolean array (boolean[])

     BitSet bits = new BitSet(180);//lets say u have 180 bools
    
    bits.set(0); // set the 0th bit.means we changed 0th bit to true
    bits.set(7); // set the 7th bit
    bits.set(8); // set the 8th bit
    ...
    //save
    long[] allbits=bits.toLongArray(); //u need 3 long type members to store 180 bools since long is 64 bit
    arrsize=allbits.length;
    prefs.putInteger("longarraysize",arrsize);
        for(int i=0 ; i < arrsize ; i++){
        prefs.putLong( string+i, allbits[i]); // long values stored in prefs
    }
    
    
    //load
    arrsize=getInteger("longarraysize",0);
    long[arrsize] allbits;
    for(int i=0 ; i < arrsize ; i++){
    allbits[i]=getLong(string+i,0); //we get all long values we stored
    }
    Bitset bits=BitSet.valueOf(allbits);//Converted long array to bits again.
    
    
    if(bits.get(15))
    {
    //do something if 15th bit is true
    }
    

    【讨论】:

    • 我加了一个小例子。
    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2012-10-27
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多