SHOW:
|
|
- or go back to the newest paste.
| 1 | import java.io.InputStream; | |
| 2 | import java.util.ArrayList; | |
| 3 | import java.util.Arrays; | |
| 4 | import java.nio.charset.Charset; | |
| 5 | ||
| 6 | public class RLE{
| |
| 7 | ||
| 8 | - | private static Byte[] StringToByteArray(String string) {
|
| 8 | + | private static Byte[] stringToByteArray(String string) {
|
| 9 | byte[] bytes = string.getBytes(Charset.forName("ASCII"));
| |
| 10 | Byte[] result = new Byte[bytes.length]; | |
| 11 | ||
| 12 | for(int i = 0; i < bytes.length; i++) | |
| 13 | result[i] = bytes[i]; | |
| 14 | ||
| 15 | return result; | |
| 16 | } | |
| 17 | ||
| 18 | - | public static void main(String []args){
|
| 18 | + | public static void main(String[] args){
|
| 19 | - | ArrayList<Byte> data = new ArrayList<Byte>( |
| 19 | + | if(args.length == 0) |
| 20 | - | Arrays.asList(StringToByteArray("www"))
|
| 20 | + | throw new IllegalArgumentException("É necessário informar a string a ser comprimida.");
|
| 21 | - | ); |
| 21 | + | |
| 22 | Byte[] data = stringToByteArray(args[0]); | |
| 23 | - | System.out.println("Entrada......: " + data);
|
| 23 | + | |
| 24 | System.out.println("Entrada......: " + Arrays.toString(data));
| |
| 25 | - | System.out.println("Comprimido...: " + data);
|
| 25 | + | |
| 26 | - | System.out.println("Descomprimido: " + DecompressRLE(data, 2));
|
| 26 | + | System.out.println("Comprimido...: " + Arrays.toString(data));
|
| 27 | System.out.println("Descomprimido: " + Arrays.toString(decompressRLE(data, 2)));
| |
| 28 | } | |
| 29 | - | private static ArrayList<Byte> compressRLE(ArrayList<Byte> data, int n) {
|
| 29 | + | |
| 30 | private static Byte[] compressRLE(Byte[] data, int n) {
| |
| 31 | ArrayList<Byte> result = new ArrayList<Byte>(); | |
| 32 | int count = 0; | |
| 33 | Byte last = 0; | |
| 34 | for(Byte b : data) {
| |
| 35 | if(b != last || count == 0xFF + n) {
| |
| 36 | writeRLE(last, count, n, result); | |
| 37 | last = b; | |
| 38 | count = 1; | |
| 39 | } else {
| |
| 40 | count++; | |
| 41 | } | |
| 42 | } | |
| 43 | ||
| 44 | writeRLE(last, count, n, result); | |
| 45 | ||
| 46 | return result.toArray(new Byte[result.size()]); | |
| 47 | } | |
| 48 | - | private static ArrayList<Byte> DecompressRLE(ArrayList<Byte> data, int n) {
|
| 48 | + | |
| 49 | private static Byte[] decompressRLE(Byte[] data, int n) {
| |
| 50 | ArrayList<Byte> result = new ArrayList<Byte>(); | |
| 51 | int count = 0; | |
| 52 | Byte last = 0; | |
| 53 | for(Byte b : data) {
| |
| 54 | if(count == n) {
| |
| 55 | count = b + n; | |
| 56 | for(int i = 0; i < count; i++) | |
| 57 | result.add(last); | |
| 58 | count = 0; | |
| 59 | } else if (b != last) {
| |
| 60 | for(int i = 0; i < count; i++) | |
| 61 | result.add(last); | |
| 62 | last = b; | |
| 63 | count = 1; | |
| 64 | } else {
| |
| 65 | count++; | |
| 66 | } | |
| 67 | } | |
| 68 | ||
| 69 | return result.toArray(new Byte[result.size()]); | |
| 70 | } | |
| 71 | ||
| 72 | private static void writeRLE(Byte b, int count, int n, ArrayList<Byte> result) {
| |
| 73 | for(int i = 0; i < Math.min(count, n); i++) | |
| 74 | result.add(b); | |
| 75 | ||
| 76 | if(count >= n) {
| |
| 77 | byte c = (byte)(count-n); | |
| 78 | result.add(c); | |
| 79 | } | |
| 80 | } | |
| 81 | } |