我有一个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
然后,为了解压缩,您需要将每个奇数列解释为运行长度,将每个偶数列解释为值。