在LibgGDX首选项中保存BooleanArray

问题描述 投票:0回答:2

我在我的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
2个回答
1
投票

如果你想要它超级紧凑,你可以使用Kryo库将其转换为二进制。然后,如果使用ByteArrayOutputStream,则可以将其另存为本地文件或将其转换为String Preference。

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();

1
投票

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

BitSet有两个原因。

  • BitSet必须使用LongArray()方法。(反之亦然valueOf(long [] longs))

您可以将位转换为long类型并存储很长时间。

  • 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
}
© www.soinside.com 2019 - 2024. All rights reserved.