Anda di halaman 1dari 8

//Program mengenai Run Length Encoding import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.List; import java.util.

ListIterator; public class SDA1111 { /* * Pada kelas ini akan dilakukan input width, height, dan informasi pixel. * serta tampilannya yang berupa width, height dan hasil RLE / data compress ionnya */ public static void main(String[] args) throws Exception { // deklarasi variable yang akan digunakan pada kelas main ini int width; int height; int koordinatx; int koordinaty; char kodewarna; BufferedReader input = new BufferedReader(new InputStreamReader(System.i n)); width = Integer.parseInt(input.readLine()); width height = Integer.parseInt(input.readLine()); height RLE compress = new RLE(width, height); //memanggil class RLE dengan nam a compress //akan dilakukan looping karena akan diinput datapixel akan diinput seba nyak width * heigth for (int i = 0; i < width * height; i++) { String a; a = input.readLine(); //variable a merupakan variabel yang berisi ko ordinatx, koordinaty, kodewarna String array[] = a.split(","); //isi variable a akan displit dengan "," (koma) koordinatx = Integer.parseInt(array[0]); //mengambil array pertama d ari variabel a dan diconvert ke Integer koordinaty = Integer.parseInt(array[1]); //mengambil array kedua dar i variabel a dan diconvert ke Interger kodewarna = (array[2].charAt(0)); //array ketiga dari variabel a dan diconvert ke bentuk char dengan char pertama saja yang diambil compress.addPixelInfo(koordinatx, koordinaty, kodewarna); // memanggil method addPixelInfo dari class RLE } compress.print(); //memanggil method print dari class RLE } } /** * Kelas yang mereprensentasikan encoding sebuah citra. Kelas ini terdapat tiga * instance variable * <code>width</code>, //meminta user menginput //meminta user menginput

* <code>height</code>, dan * <code>encoding</code>. * <code>width</code> dan * <code>height</code> menyatakan lebar dan tinggi dari citra sedangkan * <code>encoding</code> merupakan list yang berisi run. * * Method utama pada kelas ini adalah method * <code>addPixelInfo</code> yang melakukan operasi penambahan sebuah informasi * piksel ke dalam list * <code>encoding</code>. * */ class RLE { final int width; final int height; List<Run> encoding; /** * Constructor kelas RLE. Pada constructor ini selain dilakukan penetapan * nilai * <code>width</code> dan * <code>length</code> juga dilakukan pemanggilan method * <code>initializeEncoding</code> yang akan menginisialisasi list * <code>encoding</code>. * * @param width - lebar dari citra * @param height - tinggi dari citra */ public RLE(int width, int height) { this.width = width; this.height = height; initializeEncoding(); } /** * Method untuk menginisialisasi list * <code>encoding</code>. */ //membuat penampung dari list yang berupa linkedlist private void initializeEncoding() { encoding = new LinkedList<Run>(); Run s1 = new Run('#', 1); Run s2 = new Run('#', 1); Run x = new Run('*', width * height); encoding.add(s1); encoding.add(x); encoding.add(s2); // disini dibuat 3 linkedlist awal yaitu s1--x--s2 // guna s1 dan s2 adalah untuk memastikan bahwa dummy tidak berhadapan p ada list null // x merupakan dummy awal yang berisi char * dan int width*height } /** * Method untuk melakukan operasi penambahan sebuah informasi piksel ke * dalam list * <code>encoding</code>. *

* @param x - koordinat x dari piksel * @param y - koordinat y dari piksel * @param color - nilai * <code>color</code> dari piksel */ // addPixelInfo merupakan method yang menambahkan data pixel kedalam list public void addPixelInfo(int x, int y, char color) { int posisi = (x + 1) + width * y; // merupakan posisi data pixel ketika dilakukan transformasi menjadi barisan panjang ListIterator<Run> iter = encoding.listIterator(); //iter merupakan itera tor list int lengthprev = 0; //lengthprev menyimpan informasi mengenai total panj ang list sebelum dummy int lengthdummy = 0; //lengthdummy merupakan panjang dummy iter.next(); // posisi iter awalnya ada di sebelum s1.karena s1 hanya li st pembantu jadi diabaikan sehingga di next. //ingin diketahui panjang list yang ada di sebelum posisi meletakkan inp ut data pixel //looping akan dilakukan sampai panjang list sebelumnya tidak melebihi n ilai posisi while (lengthprev < posisi) { Run temp = iter.next(); // menyimpan list yang ada di sebelum dummy int pjgtemp = temp.getLength(); // menyimpan panjangnya list yang ad a di sebelum dummy lengthprev += pjgtemp; //lengthprev diupdate nilainya lengthdummy = temp.getLength();//lengthdummy diupdate nilainya } lengthprev -= lengthdummy; //panjang list sebelum dummy //posisi iter ada di setelah dummy /*terdapat * pertama * kedua * ketiga * keempat ih dari 1 */ banyak kondisi penyisipan data pixel pada dummy : ketika panjang dummy hanya 1 : ketika ingin menyisipkan di pojok kiri dummy : ketika ingin menyisipkan di pojok kanan dummy : ketika ingin menyisipkan di tengah dummy yang berukuran leb

//KASUS PERTAMA adalah ketika panjang dummy = 1 if (lengthdummy == 1) { //posisi iter sekarang ada di setelah dummy Run runsesudah = iter.next(); //menyimpan list runsesudah, posisi it er ada di setelah runsesudah iter.previous(); //posisi iter ada di setelah dummy, sebelum runsesu dah Run dummy = iter.previous(); //menyimpan list dummy, posisi iter ada di sebelum dummy Run runsebelum = iter.previous(); // menyimpan list runsebelum, posi si iter ada di sebelum runsebelum /* ada 4 kondisi yaitu * pertama : ketika warna runsebelum dan runsesudah, * kedua : ketika warna elum dan runsesudah. * ketiga : ketika warna elum * keempat : ketika warna yang diinput tidak sama dengan warna dari yang diinput sama dengan warna dari runseb yang diinput sama dengan warna dari runseb yang diinput sama dengan warna dari runses

udah */ //kondisi pertama, yang dilakukan yaitu set warna dummy = warna yang diinput if (runsebelum.getColor() != color && runsesudah.getColor() != color ) { dummy.setColor(color); } /*kondisi kedua, yang dilakukan yaitu menambahkan panjang runsebelum * dengan panjang runsesudah dan panjang dummy (=1). * Lalu menghapus list dummy dan runsesudah. */ else if (runsebelum.getColor() == color && runsesudah.getColor() == color) { runsebelum.setLength(runsebelum.getLength() + runsesudah.getLeng th() + 1); iter.next(); iter.next(); iter.remove(); iter.next(); iter.previous(); iter.remove(); } /*kondisi ketiga yang dilakukan yaitu menambahkan panjang runsebelum dengan panjang dummy (=1) *Lalu menghapus list dummynya */ else if (runsebelum.getColor() == color) { iter.next(); iter.next(); iter.remove(); runsebelum.setLength(runsebelum.getLength() + 1); } /*Kondisi keempat yang dilakukan yaitu menambahkan panjang runsesuda h dengan panjang dummy (=1) *Lalu menghapus list dummynya. */ else { iter.next(); iter.next(); iter.remove(); runsesudah.setLength(runsesudah.getLength() + 1); } } //KASUS KEDUA yaitu ketika ingin menyisipkan di pojok kiri dummy else if (posisi - 1 == lengthprev) { //posisi iter sekarang ada di setelah dummy Run dummy = iter.previous(); //menyimpan list dummy, posisi iter ada di sebelum dummy Run runsebelum = iter.previous(); //menyimpan list runsebelum, posis i iter ada di sebelum runsebelum /* ada 2 kondisi yaitu * pertama : ketika warna yang diinput sama dengan warna dari runseb elum

* kedua runsebelum */

: ketika warna yang diinput tidak sama dengan warna dari

/* pada kondisi pertama yang dilakukan adalah * panjang runsebelum ditambah 1, * panjang dummy dikurangi 1 */ if (runsebelum.getColor() == color) { dummy.setLength(dummy.getLength() - 1); runsebelum.setLength(runsebelum.getLength() + 1); } /* pada kondisi kedua yang dilakukan adalah * menambahkan list baru (letaknya diantara runsebelum dan dummy) * yang berisi warna yang diinput dan panjangnya 1, * lalu panjang dummy dikurangi 1. */ else { iter.next(); iter.add(new Run(color, 1)); dummy.setLength(dummy.getLength() - 1); } } // KASUS KETIGA yaitu ketika ingin menyisipkan di pojok kanan dummy else if (lengthdummy + lengthprev == posisi) { //posisi iter sekarang ada di setelah dummy Run dummy = iter.previous(); // menyimpan list dummy, posisi iter sk rg ada di sebelum dummy iter.next(); // posisi iter ada di setelah dummy Run runsesudah = iter.next(); // menyimpan list runsesudah, posisi i ter sekarang ada di setelah runsesudah /* ada 2 kondisi yaitu * pertama : ketika warna yang diinput sama dengan warna dari runses udah * kedua runsesudah */ /* pada kondisi pertama yang dilakukan adalah * panjang runsesudah ditambah 1, * panjang dummy dikurangi 1 */ if (runsesudah.getColor() == color) { dummy.setLength(dummy.getLength() - 1); runsesudah.setLength(runsesudah.getLength() + 1); } /* pada kondisi kedua yang dilakukan adalah * menambahkan list baru (letaknya diantara dummy dan runsesudah) * yang berisi warna yang diinput dan panjangnya 1, * lalu panjang dummy dikurangi 1. */ else { iter.previous(); iter.add(new Run(color, 1)); dummy.setLength(dummy.getLength() - 1); } } : ketika warna yang diinput tidak sama dengan warna dari

//KASUS EMPAT yaitu ketika ingin menyisipkan di tengah dummy yang beruku ran lebih dari 1 else { int pjgdummykiri = posisi - 1 - lengthprev; //menentukan panjang dum my yang ada sebelah kiri warna yang disisipkan //posisi iter sekarang ada di setelah dummy Run dummy = iter.previous(); //menyimpan list dummy, posisi iter di sebelum dummy dummy.setLength(pjgdummykiri); //panjang dummynya dijadikan sebesar pjgdummykiri iter.next(); //posisi iter di setelah dummy iter.add(new Run(color, 1)); //menambah list baru letaknya disetelah dummy, yang isinya warna yang diinput dan panjangnya 1 int pjgdummykanan = lengthdummy - pjgdummykiri - 1;// menentukan pan jang dummy yang ada disebelah kanan warnya yang disisipkan iter.add(new Run('*', pjgdummykanan)); // menambah list baru yang me rupakan dummy juga dengan panjangnya sebesar pjgdummykanan } } //membuat method print public void print() { System.out.println(width); System.out.println(height); ListIterator<Run> iter = encoding.listIterator(); int length = 0; iter.next(); // mengabaikan list s1 //mencetak tanpa list s2 while (length < width * height) { Run temp = iter.next(); length += temp.getLength(); System.out.println(temp.getColor() + "," + temp.getLength()); } } } /** * Kelas yang menyimpan informasi sebuah Run. Pada kelas ini terdapat dua * instance variable * <code>color</code> dan * <code>length</code>. * */ class Run { char color; int length; /** * Constructor kelas Run * * @param color - karakter yang menyatakan warna dari sebuah run. Nilai * <code>color</code> berada dalam rentang 0 - 9 dan A - B * @param length - karakter yang menyatakan panjang dari sebuah run. */ public Run(char color, int length) { this.color = color; this.length = length; }

/** * Method untuk mengambil nilai * <code>color</code> sebuah run * * @return nilai character yang merepresentasikan * <code>color</code> sebuah run */ public char getColor() { return color; } /** * Method untuk menetapkan nilai * <code>color</code> sebuah run * * @param color yang akan ditetapkan nilainya */ public void setColor(char color) { this.color = color; } /** * Method untuk mengambil nilai * <code>length</code> sebuah run * * @return nilai integer yang merepresentasikan * <code>length</code> sebuah run */ public int getLength() { return length; } /** * Method untuk menetapkan nilai * <code>length</code> sebuah run * * @param length yang akan ditetapkan nilainya */ public void setLength(int length) { this.length = length; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Run other = (Run) obj; if (this.color != other.color) { return false; } if (this.length != other.length) { return false; } return true; }

@Override public int hashCode() { int hash = 7; hash = 83 * hash + this.color; hash = 83 * hash + this.length; return hash; } }

Anda mungkin juga menyukai