在LibgGDX首选项中保存BooleanArray

时间:2018-03-01 21:35:35

标签: java android arrays libgdx sharedpreferences

我的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 +。

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

2 个答案:

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