我一直在寻找答案,但似乎找不到类似的问题。我花了过去的几个小时来尝试解决此问题,因此我需要指导。这是RLE字节数组的一种方法。
我似乎无法获取数组中元素的最后运行结果。即使有一个元素(例如15),它也会输出0 0而不是115。有人告诉我手动添加 for循环之后的最后一次运行。
是否可以在 for循环中添加最后一次运行?
输入:15 15 15 4 4 4 4 4 4
输出:3 15 0 0
public static byte[] encodeRle(byte[] flatData)
{
byte runLength = 1;
byte indexTracker = 0;
int runCount = countRuns(flatData);
runCount *= 2;
byte[] rleData = new byte[runCount];
for(int i = 0; i < flatData.length - 1; i++)
{
if(flatData[i] != flatData[i+1] || runLength == 15)
{
rleData[indexTracker] = runLength;
rleData[indexTracker + 1] = flatData[i];
indexTracker += 2;
runLength = 1;
}
else{
runLength++;
}
}
return rleData;
}
答案 0 :(得分:0)
尝试添加如下所示的条件,以防您在输入数据的最后一次运行时循环中断。
public static byte[] encodeRle(byte[] flatData)
{
byte runLength = 1;
byte indexTracker = 0;
int runCount = countRuns(flatData);
runCount *= 2;
byte[] rleData = new byte[runCount];
for(int i = 0; i < flatData.length - 1; i++)
{
if(flatData[i] != flatData[i+1] || runLength == 15)
{
if(flagData[i+1] == flatData[flatData.length - 1]){
rleData[indexTracker] = 0;
rleData[indexTracker + 1] = 0;
break;
}
rleData[indexTracker] = runLength;
rleData[indexTracker + 1] = flatData[i];
indexTracker += 2;
runLength = 1;
}
else{
runLength++;
}
}
return rleData;
}
这会将0 0放入您的输出数组,并中断上次运行的循环。
希望这对您有帮助!