简体   繁体   中英

RLE - my code produced more instead less?

Im trying to solve a task where I need to implement two methods for the RLE function. I wrote this code for the compress method:

List<Character> compressRLE(List<Character> text) {

List<Character> ergebnis = new ArrayList<>();
int count = 48;

for (int i = 0; i < text.size(); i++) {

    
    if (i == 0) {
        ergebnis.add(text.get(0));
        count++;
    }
    
    if (i != 0 && text.get(i) == text.get(i-1)) {
        count++;
    }else if(i != 0 &&  text.get(i) != text.get(i-1)) {
        
        ergebnis.add((char)count);
        ergebnis.add(text.get(i));
        count = 49;
    }
    
    if (i == text.size()-1) {
        ergebnis.add((char)count);
    }
}

return ergebnis;

}

that arrayList below I want to compress:

[a, a, a, c, a, a, a, e, e, a, d, e, f, a, d, a, c, d, c, e, a, c, a, f, a, a, a, b, e, a, c, b, c, e, b, d, e, a, e, d, a, e, c, f, b, a, a, a, e, a, d, d, a, d, a, f, e, a, a, a, a, e, c, c, d, f, e, d, e, e, a, e, a, a, b, e, e, a, a, d, a, b, b, a, a, a, d, e, a, e, e, b, a, e, a, e, c, a, e, f, a, a, a, b, e, d, a, c, a, d, f, a, c, b, a, e, a, a, d, d, a, e, a, f, b, d, d, d, a, c, b, d, d, e, f, b, e, d, c, e, c, d, a, a, a, a, a, d, d, a, e, c, a, d, c, e, a, b, a, a, b, a, a, f, b, a, a, d, a, e, d, b, a, b, e, a, a, d, d, d, a, e, a, a, b, e, a, a, a, e, e, e, a, c, d, e, d, c, a, a, e, a, e, e, e, e, a, e, e, e, a, a, a, a, d, a, b, a, a, e, e, c, c, a, e, d, a, d, e, c, a, d, f, c, a, e, a, a, e, e, e, e, a, d, e, a, e, a, c, e, a, d, a, b, a, a, e, a, b, b, e, b, d, a, e, e, e, e, c, a, d, b, e, e, a, b, b, c, a, b, a, a, a, d, a, a, c, e, e, e, a, c, f, a, d, a, d, b, e, a, a, e, b, a, a, a, e, a, a, e, a, d, f, c, a, e, c, d, b, e, a, a, e, d, b, a, a, e, e, b, a, e, e, c, b, a, a, a, a, d, a, a, a, d, e, b, c, e, a, a, a, e, b, a, e, a, a, e, a, a, e, c, a, a, e, c, a, b, c, e, e, c, d, b, a, e, e, d, e, a, c, f, e, a, e, b, e, e, a, e, a, b, a, a, d, e, a, e, e, d, c, b, a, a, e, f, a, a, a, d, f, e, c, a, a, e, e, a, d, a, d, a, a, f, a, a, a, e, a, a, b, a, e, e, a, c, a, f, a, c, e, a, e, a, c, a, c, a, a, a, a, a, c, d, a, a, e, a, a, c, a, b, a, a, a, e, a, c, e, a, a, a, d, c, e, a, e, a, a, d, a, a, d, c, c, a, a, b, d, a, a, e, c, e, e, e, f, a, c, c, c, d, a, a, d, a, b, a, c, b, a, b, e, e, a, e, a, c, d, a, a, a, c, a, a, a, a, a, e, e, c, c, a, a, a, e, d, a, c, e, c, a, a, c, d, b, a, e, a, e, c, d, c, e, a, f, e, a, e, a, a, e, e, a, c, a, c, a, a, e, a, a, a, e, e, a, c, d, a, a, d, a, a, d, e, b, b, f, a, a, b, d, e, a, a, d, c, d, b, c, a, a, c, d, c, a, a, d, d, d, a, d, a, c, a, a, a, a, a, a, e, e, a, f, e, f, f, b, e, b, c, a, a, a, b, a, e, e, f, e, d, b, b, a, a, a, a, e, e, a, b, d, a, a, b, a, a, e, a, d, d, d, f, a, a, f, e, d, a, a, a, d, d, a, d, b, a, e, a, e, c, e, d, e, b, a, a, a, e, c, a, b, e, e, c, e, e, c, a, a, e, a, a, d, b, a, b, e, a, a, a, d, d, e, a, e, a, a, b, d, a, d, a, c, b, f, a, c, a, a, a, d, a, f, a, a, a, d, c, e, a, d, a, a, a, c, d, a, b, e, c, d, d, b, a, b, b, a, a, e, f, a, d, b, a, a, c, a, d, b, a, e, e, a, a, c, a, c, a, a, e, c, b, c, a, e, a, a, b, a, d, b, b, e, a, d, c, e, c, d, c, d, d, c, a, a, e, c, b, a, a, a, a, d, f, f, a, d, d, d, a, a, a, f, e, e, e, c, a, a, f, a, b, d, d, b, a, b, b, d, a, a, d, b, a, a, d, a, d, c, c, a, d, b, e, e, b, a, d, d, f, b, e, a, a, e, d, a, c, d, a, d, a, e, b, b, a, a, e, a, a, c, e, a, a, d, d, d, a, e, a, e, a, a, c, b, c, d, a, b, d, d, f, f, a, a, a, a, a, e, a, f, b, b, c, c, b, d, d, e, a, c, e, f, b, e, a, a, a, a, d, a, d, a, e, c, e, d, d, b, c, a, d, c, a, b, c, e, d, d, d, c, d, c, a, d, e, a, a, d, a, a, a, a, c, b, e, b, e, d, a, a, d, e, b, c, d, b, a, a, e, a, a, e, f, a, c, d, d, e, a, b, d, a, a, d, d, a, d, e]

But somehow Im doing it right and wrong at the same time. I did the compress but the size of the list has been increased almost 3 times:

[a, 3, c, 1, a, 3, e, 2, a, 1, d, 1, e, 1, f, 1, a, 1, d, 1, a, 1, c, 1, d, 1, c, 1, e, 1, a, 1, c, 1, a, 1, f, 1, a, 3, b, 1, e, 1, a, 1, c, 1, b, 1, c, 1, e, 1, b, 1, d, 1, e, 1, a, 1, e, 1, d, 1, a, 1, e, 1, c, 1, f, 1, b, 1, a, 3, e, 1, a, 1, d, 2, a, 1, d, 1, a, 1, f, 1, e, 1, a, 4, e, 1, c, 2, d, 1, f, 1, e, 1, d, 1, e, 2, a, 1, e, 1, a, 2, b, 1, e, 2, a, 2, d, 1, a, 1, b, 2, a, 3, d, 1, e, 1, a, 1, e, 2, b, 1, a, 1, e, 1, a, 1, e, 1, c, 1, a, 1, e, 1, f, 1, a, 3, b, 1, e, 1, d, 1, a, 1, c, 1, a, 1, d, 1, f, 1, a, 1, c, 1, b, 1, a, 1, e, 1, a, 2, d, 2, a, 1, e, 1, a, 1, f, 1, b, 1, d, 3, a, 1, c, 1, b, 1, d, 2, e, 1, f, 1, b, 1, e, 1, d, 1, c, 1, e, 1, c, 1, d, 1, a, 5, d, 2, a, 1, e, 1, c, 1, a, 1, d, 1, c, 1, e, 1, a, 1, b, 1, a, 2, b, 1, a, 2, f, 1, b, 1, a, 2, d, 1, a, 1, e, 1, d, 1, b, 1, a, 1, b, 1, e, 1, a, 2, d, 3, a, 1, e, 1, a, 2, b, 1, e, 1, a, 3, e, 3, a, 1, c, 1, d, 1, e, 1, d, 1, c, 1, a, 2, e, 1, a, 1, e, 4, a, 1, e, 3, a, 4, d, 1, a, 1, b, 1, a, 2, e, 2, c, 2, a, 1, e, 1, d, 1, a, 1, d, 1, e, 1, c, 1, a, 1, d, 1, f, 1, c, 1, a, 1, e, 1, a, 2, e, 4, a, 1, d, 1, e, 1, a, 1, e, 1, a, 1, c, 1, e, 1, a, 1, d, 1, a, 1, b, 1, a, 2, e, 1, a, 1, b, 2, e, 1, b, 1, d, 1, a, 1, e, 4, c, 1, a, 1, d, 1, b, 1, e, 2, a, 1, b, 2, c, 1, a, 1, b, 1, a, 3, d, 1, a, 2, c, 1, e, 3, a, 1, c, 1, f, 1, a, 1, d, 1, a, 1, d, 1, b, 1, e, 1, a, 2, e, 1, b, 1, a, 3, e, 1, a, 2, e, 1, a, 1, d, 1, f, 1, c, 1, a, 1, e, 1, c, 1, d, 1, b, 1, e, 1, a, 2, e, 1, d, 1, b, 1, a, 2, e, 2, b, 1, a, 1, e, 2, c, 1, b, 1, a, 4, d, 1, a, 3, d, 1, e, 1, b, 1, c, 1, e, 1, a, 3, e, 1, b, 1, a, 1, e, 1, a, 2, e, 1, a, 2, e, 1, c, 1, a, 2, e, 1, c, 1, a, 1, b, 1, c, 1, e, 2, c, 1, d, 1, b, 1, a, 1, e, 2, d, 1, e, 1, a, 1, c, 1, f, 1, e, 1, a, 1, e, 1, b, 1, e, 2, a, 1, e, 1, a, 1, b, 1, a, 2, d, 1, e, 1, a, 1, e, 2, d, 1, c, 1, b, 1, a, 2, e, 1, f, 1, a, 3, d, 1, f, 1, e, 1, c, 1, a, 2, e, 2, a, 1, d, 1, a, 1, d, 1, a, 2, f, 1, a, 3, e, 1, a, 2, b, 1, a, 1, e, 2, a, 1, c, 1, a, 1, f, 1, a, 1, c, 1, e, 1, a, 1, e, 1, a, 1, c, 1, a, 1, c, 1, a, 5, c, 1, d, 1, a, 2, e, 1, a, 2, c, 1, a, 1, b, 1, a, 3, e, 1, a, 1, c, 1, e, 1, a, 3, d, 1, c, 1, e, 1, a, 1, e, 1, a, 2, d, 1, a, 2, d, 1, c, 2, a, 2, b, 1, d, 1, a, 2, e, 1, c, 1, e, 3, f, 1, a, 1, c, 3, d, 1, a, 2, d, 1, a, 1, b, 1, a, 1, c, 1, b, 1, a, 1, b, 1, e, 2, a, 1, e, 1, a, 1, c, 1, d, 1, a, 3, c, 1, a, 5, e, 2, c, 2, a, 3, e, 1, d, 1, a, 1, c, 1, e, 1, c, 1, a, 2, c, 1, d, 1, b, 1, a, 1, e, 1, a, 1, e, 1, c, 1, d, 1, c, 1, e, 1, a, 1, f, 1, e, 1, a, 1, e, 1, a, 2, e, 2, a, 1, c, 1, a, 1, c, 1, a, 2, e, 1, a, 3, e, 2, a, 1, c, 1, d, 1, a, 2, d, 1, a, 2, d, 1, e, 1, b, 2, f, 1, a, 2, b, 1, d, 1, e, 1, a, 2, d, 1, c, 1, d, 1, b, 1, c, 1, a, 2, c, 1, d, 1, c, 1, a, 2, d, 3, a, 1, d, 1, a, 1, c, 1, a, 6, e, 2, a, 1, f, 1, e, 1, f, 2, b, 1, e, 1, b, 1, c, 1, a, 3, b, 1, a, 1, e, 2, f, 1, e, 1, d, 1, b, 2, a, 4, e, 2, a, 1, b, 1, d, 1, a, 2, b, 1, a, 2, e, 1, a, 1, d, 3, f, 1, a, 2, f, 1, e, 1, d, 1, a, 3, d, 2, a, 1, d, 1, b, 1, a, 1, e, 1, a, 1, e, 1, c, 1, e, 1, d, 1, e, 1, b, 1, a, 3, e, 1, c, 1, a, 1, b, 1, e, 2, c, 1, e, 2, c, 1, a, 2, e, 1, a, 2, d, 1, b, 1, a, 1, b, 1, e, 1, a, 3, d, 2, e, 1, a, 1, e, 1, a, 2, b, 1, d, 1, a, 1, d, 1, a, 1, c, 1, b, 1, f, 1, a, 1, c, 1, a, 3, d, 1, a, 1, f, 1, a, 3, d, 1, c, 1, e, 1, a, 1, d, 1, a, 3, c, 1, d, 1, a, 1, b, 1, e, 1, c, 1, d, 2, b, 1, a, 1, b, 2, a, 2, e, 1, f, 1, a, 1, d, 1, b, 1, a, 2, c, 1, a, 1, d, 1, b, 1, a, 1, e, 2, a, 2, c, 1, a, 1, c, 1, a, 2, e, 1, c, 1, b, 1, c, 1, a, 1, e, 1, a, 2, b, 1, a, 1, d, 1, b, 2, e, 1, a, 1, d, 1, c, 1, e, 1, c, 1, d, 1, c, 1, d, 2, c, 1, a, 2, e, 1, c, 1, b, 1, a, 4, d, 1, f, 2, a, 1, d, 3, a, 3, f, 1, e, 3, c, 1, a, 2, f, 1, a, 1, b, 1, d, 2, b, 1, a, 1, b, 2, d, 1, a, 2, d, 1, b, 1, a, 2, d, 1, a, 1, d, 1, c, 2, a, 1, d, 1, b, 1, e, 2, b, 1, a, 1, d, 2, f, 1, b, 1, e, 1, a, 2, e, 1, d, 1, a, 1, c, 1, d, 1, a, 1, d, 1, a, 1, e, 1, b, 2, a, 2, e, 1, a, 2, c, 1, e, 1, a, 2, d, 3, a, 1, e, 1, a, 1, e, 1, a, 2, c, 1, b, 1, c, 1, d, 1, a, 1, b, 1, d, 2, f, 2, a, 5, e, 1, a, 1, f, 1, b, 2, c, 2, b, 1, d, 2, e, 1, a, 1, c, 1, e, 1, f, 1, b, 1, e, 1, a, 4, d, 1, a, 1, d, 1, a, 1, e, 1, c, 1, e, 1, d, 2, b, 1, c, 1, a, 1, d, 1, c, 1, a, 1, b, 1, c, 1, e, 1, d, 3, c, 1, d, 1, c, 1, a, 1, d, 1, e, 1, a, 2, d, 1, a, 4, c, 1, b, 1, e, 1, b, 1, e, 1, d, 1, a, 2, d, 1, e, 1, b, 1, c, 1, d, 1, b, 1, a, 2, e, 1, a, 2, e, 1, f, 1, a, 1, c, 1, d, 2, e, 1, a, 1, b, 1, d, 1, a, 2, d, 2, a, 1, d, 1, e, 1]

ergebnis.size() give me this: 2996 (from 1000 to 2996)

I cant figure what went wrong here so Im kindly ask for a little help here.

First of all: do not throw an acronym on stackoverflow and expect people to know what it means. Maybe your whole world is about RLE right now, so you know perfectly well what it means, but not everyone does. So, for the benefit of other readers (and search engines):

RLE stands for Run Length Encoding .

RLE is the most primitive lossless compression algorithm imaginable. (There exist even more primitive compression algorithms, but they are lossy, for example compress( String s ) => return ""; )

Secondly: you don't really know whether you "did the compress" unless you also "do the decompress". But let us assume that your algorithm is correct, based on a visual examination of the input data and the result. (I highly doubt that it is correct, because it contains some magic numbers like 48 and 49, which make me not want to read the code.)

Finally: Yes, what you observe is perfectly normal with RLE. If your data to compress has lots of single-value sequences and not many repeated-value sequences, then the result of the RLE algorithm will be longer than the original data to compress, because for every single-value sequence it will produce two values in the output.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM