我的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 +。
请帮忙,还有其他办法吗?
答案 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有两个原因。
您可以将位转换为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
}