如何将二维布尔数组编码成一维数组,之后在java中解码?

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

我在sqlite数据库中使用一维字节数组来存储blob数据。

我正在寻找一种快速而简洁的方法将二维布尔数组(boolean[][])转换为一维字节数组(byte[]),然后再返回。

我可以使用任何外部库和临时数组。

我唯一的想法是将二维数组编码成一维字符串数组,作为外数组索引,与值之间用破折号或其他唯一的符号隔开,然后转换为字节(因为这样可以消除维度上的不兼容),但这似乎不是最佳的。

有没有什么好的、干净的方法来完成这个操作?

先谢谢你了。

java arrays multidimensional-array boolean
1个回答
1
投票

看来你的代码中需要某种编码解码声明。所以如果我是你,我会做这样的东西。

给定

  • N维数组[i][j][k]... [n];
  • 二进制数的长度等于维数(N)。

想象一下,有一个二维数组。

    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;
    }
}

0
投票

经过思考,我发现用字符串编码比用字节编码更简单。这是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;

}
© www.soinside.com 2019 - 2024. All rights reserved.