[英]How to encode a two-dimensional boolean array to a one-dimensional array and later decode it in java?
我正在使用一维字节数组将 blob 数据存储在 sqlite 数据库中。
我正在寻找一种将二维 boolean arrays (boolean [][]) 转换为一维字节 arrays (byte[]) 的快速而干净的方法。
我可以使用任何外部库和临时 arrays。
我唯一的想法是将二维数组编码为一维字符串数组,作为外部数组索引,通过破折号或其他唯一符号与值分隔,然后转换为字节(因为这将消除维度不兼容),但是似乎不是最优的。
有没有什么好的、干净的方法来做这个操作?
提前致谢。
您的代码中似乎需要某种编码/解码声明。 所以如果我是你,我会做这样的事情。
鉴于:
想象一下有一个二维数组:
1 2
1 [true] [true]
2 [false] [false]
一维可以从左到右或从右到左编码。 例如,我会从右到左。 结果数组应该像
[0b01] [0b01]
编码:
class Encoder {
private static final byte START_MASK = 0b01;
public byte[] code(boolean[][] arr) {
int length = arr.length;
byte[] result = new byte[length];
for (int i = 0; i < length; i++) {
byte mask = START_MASK;
for (int j = 0; j < length; j++) {
result[i] = (byte) (result[i] | (arr[j][i] ? mask : 0));
mask = (byte) (mask << 2);
}
}
return result;
}
public boolean[][] decode(byte[] arr) {
int length = arr.length;
boolean[][] result = new boolean[length][length];
for (int i = 0; i < length; i++) {
byte mask = START_MASK;
for (int j = 0; j < length; j++) {
result[j][i] = (mask & arr[i]) == mask;
mask = (byte) (mask << 2);
}
}
return result;
}
}
经过一番思考,我发现编码为字符串而不是尝试编码为字节更简单。 这得到了 SQLite 的支持,从而实现了我的目标。 这是我用来做的代码。 它还支持不同大小的子阵列。 我不确定是否超过最大字符串长度。
public static String Bool2DToString(boolean[][] arr){
String result = "";
for(int i = 0; i < arr.length; i++){
if(i > 0){result += ":";}
for(int j = 0; j < arr[i].length; j++){
if(arr[i][j]){
result += "1";
} else {
result += "0";
}
}
}
return result;
}
public static boolean[][] StringToBool2D(String str){
String[] splitstr = str.split(":");
boolean[][] result = new boolean[splitstr.length][splitstr[0].length()];
for(int i = 0; i < splitstr.length; i++){
char[] a = splitstr[i].toCharArray();
for(int j = 0; j < a.length; j++){
if(a[j] == '1'){
result[i][j] = true;
} else {
result[i][j] = false;
}
}
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.