一点数组操作



我有一个2d数组String compressedColors[][],它由0到n之间的数字填充(其中n是图像中的颜色数量)。现在我试图进一步压缩我的数组,以便写入文件,我的一个想法是用某种乘法运算符替换连续的相同元素。如I'd like:

compressedColors[0][0]=="1"

compressedColors[0][1] == "1"变为

compressedColors[0][0]=="2*1"

compressedColors[0][1] == ""

对于大量连续相同的元素,这将需要发生,并且我只希望在数组的第二维上进行压缩。如果两行都用0填充,我希望在compressedColors[x][0]处有2个独立的n*0值。

我知道这是一个很大的要求,但是你知道我怎么才能做到吗?我甚至不知道从哪里开始…谢谢!

我写了一个例子,至少应该给你一个想法如何实现你的问题的解决方案。我现在没有机会测试这个,所以我不确定如果不修改它是否会工作。

public static String[][] compress(String[][] sArray){
    for(String s[] : sArray){
        int current = 0;
        while(current <= s.length){
            int sequentials = 1;
            while(s[current].equals(s[current+sequentials])){
                s[current+sequentials] = "";
                sequentials++;
                if(current+sequentials>s.length) 
                    break;
            }
            if(sequentials > 1) s[current] = sequentials+"*"+s[current];
            current++;
        }
    }   
    return sArray;
}

要回答您的问题,您需要同时实现压缩和解压缩。

压缩算法(感谢@harold提供的术语"运行长度编码"),类似于:

  // for an uncompressed image of height h and width w, stored in int colors[][]
  for row = 0 to height
    for column = 0 to width
      // gets the value
      value = colors[row][column]
      // calculates how long the value repeats
      runLength = 0
      nextValue = value
      i = 0
      while(nextValue == value)
        i++
        runLength++
        nextValue = colors[row][column + i]
      // sets the runlength and the value
      compressedColors[row][column] = runLength
      compressedColors[row][column + 1] = value
      // moves to next different value
      column = column + runLength

然后,为了解压缩,您需要将每个奇数列解释为运行长度,将每个偶数列解释为值。

相关内容

  • 没有找到相关文章

最新更新