6.
Karakter terakhir adalah D dengan posisi kelima ganjil. Karakter tersebut menempati di sebelah kanan akar, tetapi sudah ada data A dan B maka
currsor turun 2 langkah dan membuat node D.
3.5 Desain User Interface
Tampilan atau user inteface merupakan komponen yang penting dalam sebuah aplikasi atau program, oleh karena itu untuk mempermudah penggunaan
aplikasi kompresi ini penulis membuat sebuah rancangan untuk user interface. Tampilan aplikasi ini dibuat menggunakan kelas form dalam Java. Penggunaan
kelas JTabedPane untuk tampilan berguna mempersingkat dan mengurangi banyaknya form yang digunakan. Untuk lebih memperjelasnya, berikut rancangan
yang akan dibuat :
Gambar 3.5 Interface encoding
Gambar 3.6 Interface decoding
Secara garis besar, tampilan untuk encoding dan decoding hampir sama. Kedua tampilan mempunyai jumlah tombol dan susunan panel yang sama. Untuk
panel detail pada encoding, akan saya tampilkan ukuran asli dan ukuran file setelah dikompresi beserta compression ratio. Selain itu pada tampilan encoding
juga ditambahkan panel untuk memilih algoritma yang akan digunakan. Pada panel detail untuk decoding akan ditampilkan ukuran setelah di decoding beserta
metode atau algoritma yang digunakan.
3.6 Spesifikasi Software dan Hardware
Spesifikasi perangkat keras dan perangkat lunak yang digunakan untuk proses implementasi adalah sebagai berikut :
1 Processor : IntelR CoreTM i3 CPU M380 2.53GHz
2 Memory : 2048 MB
3 Harddisk : 320 GB
4 Operating System :Windows 7 Ultimate 2013 Microsoft Corporation. All Rights
Reserved 5 Software
: NetBeans IDE 7.3 PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
41
4 BAB IV
IMPLEMENTASI DAN ANALISIS
Pada bab ini akan dibahas tentang implementasi rancangan yang telah dijelaskan pada bab sebelumnya dan hasil analisa dari pengujian program.
Implementasi tersebut meliputi ketiga algoritma yang akan dibuat dengan bahasa pemrograman Java. Pada bab sebelumnya telah dijelaskan proses-proses yang
akan dilakukan oleh sistem, berikut adalah implementasi dari tiap proses tersebut.
4.1 Proses Encoding
Proses yang pertama adalah proses encoding yaitu proses data teks awal akan diubah menjadi kode-kode biner yang baru. Proses ini menghasilkan
keluaran berupa file hasil kompresi.
4.1.1 Implementasi Proses Baca Teks
Pada proses ini, akan dibagi menjadi dua implementasi yaitu implementasi untuk memilih file dan implementasi untuk membaca file.
4.1.1.1 Memilih File
Gambar 4.1 Implementasi proses memilih file encoding
Penulis menggunakan kelas JFileChooser untuk menampilkan kotak dialog browse, serta menggunakan WindowsLookAndFeel yang memberi kesan
seperti halnya kotak dialog pada aplikasi umumnya yang berjalan di Windows. Penggunaan kelas FileFilter berfungsi untuk menyaring dan hanya menampilkan
file yang telah diatur. Pada program, file yang akan di-filter atau diperbolehkan hanya file berekstensi .TXT atau Text Format. Setelah file dipilih, maka file akan
disimpan pada sebuah variabel.
4.1.1.2 Membaca File
Gambar 4.2 Implementasi proses membaca file encoding
Pada proses baca file, penulis tidak menggunakan fungsi Stream seperti halnya FileInputStream atau menggunakan kelas FileReader melainkan
menggunakan fungsi yang telah tersedia di kelas Files dalam package java.nio.file PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
dan memasukannya ke dalam kelas. Fungsi tersebut hampir sama seperti fungsi Stream yaitu membaca file, hanya saja pada fungsi ini program akan membaca
seluruh karakter yang ada di dalam file masukan sehingga nantinya tidak akan ada karakter yang tidak terbaca.
4.1.2 Implementasi Proses Pembentukan Pohon Biner
Pada proses ini akan ada tiga implementasi dari proses pembentukan pohon biner. Ketiga implementasi tersebut menyesuaikan dengan jumlah
algoritma yang akan diuji pada skripsi ini yaitu pembentukan pohon biner algoritma Huffman Statis, Huffman Dinamis dan Huffman Modifikasi.
4.1.2.1 Pohon Biner Huffman Statis
Gambar 4.3 Implementasi pembentukan pohon Huffman Statis
Pada implementasi pembentukan pohon biner Huffman Statis, node yang berisi karakter selalu ditempatkan di lengan sebelah kanan. Implementasi
dari ciri khas Huffman Statis, program akan mengecek terlebih dahulu apakah lengan sebelah kanan kosong null atau tidak, jika kosong maka karakter
membuat node baru. Tetapi jika di sebelah kanan terdapat node atau tidak kosong, maka cursor akan bergerak ke bawah melewati node tersebut untuk mencari
hingga posisi lengan sebelah kanan kosong.
4.1.2.2 Pohon Biner Huffman Dinamis
Gambar 4.4 Implementasi pembentukan pohon Huffman Dinamis
Implementasi pembentukan pohon biner Huffman Dinamis terlihat lebih panjang dan rumit, hal ini dikarenakan pohon biner akan selalu berubah
menyesuaikan jumlah frekuensi kemunculan setiap karakter yang masuk. Langkah pertama program akan mengecek lengan sebelah kanan kosong atau tidak, jika
kosong maka karakter akan membentuk node baru dengan jumlah diisi 1 cursor.setJumlah1. Jumlah ini merupakan frekuensi kemunculan karakter, hal
ini juga yang membedakan Huffman Dinamis dengan metode Huffman yang lain. Langkah kedua jika sebelah kanan terdapat node maka program akan
mengecek, jika data node tidak sama dengan karakter maka variabel n akan diisi dengan cursor dan cursor akan turun ke bawah melewati node tersebut. Tetapi
jika data node sama dengan karakter, maka jumlah akan ditambah dengan 1 dan variabel n akan dibandingkan dengan data node. Proses perbandingan ini akan
mengecek jumlah pada variabel n dan pada node, jika pada variabel n lebih kecil jumlahnya dibanding dengan node maka posisi keduanya akan ditukar.
4.1.2.3 Pohon Biner Huffman Modifikasi
Gambar 4.5 Implementasi pembentukan pohon Huffman Modifikasi
Pembentukan pohon biner Huffman Modifikasi penulis implementasikan mirip seperti pembentukan pohon biner Huffman Statis, hanya saja terdapat
perbedaan pada peletakan node setiap karakter. Ciri khas yang saya berikan pada algoritma ini adalah posisi tiap karakter ganjil dan genap akan menentukan
peletakan pada pohon biner,pada implementasi terdapat variabel boolean yaitu isKanan_Ganjil. Variabel ini mempunyai arti jika posisi karakter adalah ganjil,
maka akan ditempatkan pada lengan sebelah kanan. Cara kerja algoritma ini, pertama variabel isKanan_Ganjil diberi nilai
true karena karakter pertama pasti mempunyai posisi ganjil. Langkah berikutnya akan mengecek sebelah kanan dari cursor jika kosong dan isKanan_Ganjil adalah
true maka akan membentuk node baru serta memberi nilai isKanan_Ganjil PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
menjadi false karena pasti posisi karakter berikutnya adalah genap. Jika tidak kosong maka cursor akan menuju ke bawah dan melewati node tersebut.
Kemudian jika sebelah kiri dari cursor kosong dan isKanan_Ganjil adalah false maka akan membentuk node baru serta memberi nilai isKanan_Ganjil
menjadi true. Jika tidak kosong akan melewati node tersebut dan cursor menuju ke bawah.
4.1.3 Implementasi Proses Analisis Biner
Pada proses ini, akan dibahas tentang pembentukan kode biner1 dan 0 dari hasil pembentukan pohon biner pada proses sebelumnya. Pada implementasi
ini akan dibagi menjadi dua, yang pertama yaitu implementasi pada Huffman Statis dan Huffman Modifikasi, serta yang kedua implementasi pada Huffman
Dinamis. Kedua implementasi tersebut menggunakan sebuah kelas utama yaitu KodeHuffman, berikut isi dari kelas tersebut :
Gambar 4.6 Source code kelas KodeHuffman.java
Pada kelas tersebut terdapat dua atribut yaitu huruf dan kode yang masing-masing bertipe String. Kelas ini pada dasarnya berfungsi untuk
menyimpan kode biner yang baru dari masing-masing huruf atau karakter. Di dalam kelas terdapat method set dan get untuk mempermudah dalam
mengaksesnya. PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
4.1.3.1 Implementasi Huffman Statis dan Huffman Modifikasi
Gambar 4.7 Implementasi analisis biner Huffman Statis dan modifikasi method
generateKode Dalam proses ini nantinya terdapat dua method, salah satunya
adalah method generateKode. Method ini secara garis besar berfungsi untuk menentukan kode biner yang baru dari masing-masing karakter. Di
dalam potongan program di atas, dapat dibagi menjadi dua proses yaitu proses membentuk pohon biner dengan membuat objek dari kelas
BinaryTree dan proses mencari kode di dalam pohon biner. Pencarian kode tersebut dilakukan dengan memanggil method berikutnya yaitu
method find dengan parameter objek pohon biner dan karakter yang di cari. Dalam method ini terdapat perbedaan antara algoritma Huffman Statis
dan Huffman Modifikasi, perbedaan tersebut didasarkan pada bentuk pohon biner yang berbeda dari kedua algoritma.
Gambar 4.8 Implementasi analisis biner Huffman Statis method find
Method find tersebut digunakan untuk algoritma Huffman Statis, di mana jika dilihat hanya mengecek sebelah kanan dari pohon biner. Cara
kerja dari proses ini, pertama program akan terus berulang hingga cursor sama dengan null. Program akan mengecek sebelah kanan, apakah data di
node sama dengan data yang dicari. Jika sesuai maka kode akan berisi 1 sertacursor akan berubah menjadi null dan looping berhenti.
Jika sebelah kanan data dalam node tidak sesuai dengan data yang dicari maka kode akan berisi 0 dan cursor akan berpindah ke bawah serta
berulang untuk kembali mengecek dari awal. Tetapi jika sebelah kiri tidak ada kata “simpul” hal itu berarti tidak ada cabang di bawahnya maka
program akan berhenti looping dengan membuat cursor menjadi null. PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Gambar 4.9 Implementasi analisis biner Huffman Modifikasi method
find Method find tersebut digunakan untuk algoritma Huffman
Modifikasi, terlihat lebih panjang karena program harus mengecek lengan sebelah kanan dan kiri. Hal itu dikarenakan pohon biner pada algoritma ini
menggunakan semua lengannya untuk menyimpan karakter. Pada program tersebut terdapat variabel boolean kanan yang diberi nilai awal true.
Variabel ini berfungsi supaya program mengecek lengan sebelah kanan terlebih dahulu, jika sebelah kanan sudah tidak ada data dan karakter yang
dicari belum ditemukan maka variabel kanan menjadi false. Perubahan nilai variabel kanan menjadi falseini membuat program
akan berpindah ke lengan sebelah kiri dimulai kembali dari atas root. Jika data tidak ditemukan maka proses akan berhenti dari looping.
4.1.3.2 Implementasi Huffman Dinamis
Gambar 4.10 Implementasi analisis biner Huffman Dinamis method
generateCode
Pada implementasi Huffman Dinamis, proses analisis biner hampir sama seperti pada Huffman Statis atau Huffman Modifikasi. Terdapat dua method yang
akan digunakan yaitu generateCode dan prosesGenerate dengan parameter objek dari BinaryTree. Pada method prosesGenerate berfungsi untuk mencari
kode baru pada setiap karakter yang sudah dimasukan di dalam pohon biner. Proses pemasukan karakter terdapat di dalam method generateCode. Untuk
proses analisis biner Huffman Dinamis ini juga menggunakan kelas KodeHuffman yang sudah dibahas sebelumnya.
Gambar 4.11 Implementasi analisis biner Huffman Dinamis method
prosesGenerate
Di dalam method prosesGenerate ini berbeda dengan method find pada algoritma Huffman yang lain. Di sini penulis mengecek bukan dengan
karakter yang dicari, melainkan dari atas ke bawah dengan mengganti jumlah frekuensi menjadi 0. Hal ini saya lakukan karena tidak mungkin ada frekuensi
karakter berjumlah 0 pada saat karakter masuk ke dalam pohon biner. Setiap karakter yang baru dicek akan di masukan ke dalam Arraylist dan mengganti
frekuensi jumlahnya menjadi 0. Program akan melewati node jika jumlahnya adalah 0 dan akan berhenti looping jika sudah tidak ada node di sebelah kanan.
4.1.4 Implementasi Proses Encoding
Proses encoding merupakan sebuah proses di mana program akan mengubah setiap karakter pada data teks menjadi sekumpulan kode biner yang
baru. Pada implementasi proses ini, akan dibagi menjadi dua bagian yaitu implementasi encoding pada Huffman Modifikasi, implementasi encoding pada
Huffman Statis dan Huffman Dinamis.
4.1.4.1 Implementasi Encoding Huffman Statis dan Huffman Dinamis
Gambar 4.12 Implementasi encoding Huffman Statis dan Dinamis
Implementasi pada Huffman Statis dan Huffman Dinamis mempunyai proses yang sama, karena pada dasarnya pembentukan pohon biner kedua
algoritma tersebut juga sama. Pembentukan pohon biner yang hanya menggunakan lengan sebelah kanan memberikan dampak positif serta
mempermudah dalam proses ini. Dampak yang dihasilkan adalah tidak adanya kode biner yang bersifat ambigu, yang berarti akhiran dari sebuah kode bukan
merupakan awalan dari kode yang lain. Pada method tersebut terdapat dua buah parameter yaitu Arraylist kelas
KodeHuffman dan data seluruh isi teks bertipe String. Cara kerja dari method ini adalah membandingkan setiap karakter pada data teks dengan Arraylist
KodeHuffman, sehingga hasil dari proses ini berupa data String yang berisi kumpulan kode biner.
4.1.4.2 Implementasi Encoding Huffman Modifikasi
Gambar 4.13 Implementasi encoding Huffman Modifikasi
Implementasi proses encoding pada algoritma Huffman Modifikasi berbeda dari Huffman Statis atau Huffman Dinamis, perbedaan ini dikarenakan
struktur pohon biner yang berbeda dari algoritma lain. Algoritma ini menggunakan semua lengannya untuk menyimpan node. Dampak dari
penggunaan semua lengan pada pohon biner, mengakibatkan adanya sifat ambigu. Oleh karena itu penulis membuat sebuah aturan untuk pembatas antar kode yaitu :
Kanan separator 0 Kiri separator 1
Aturan tersebut merupakan kebalikan dari kode di setiap lengan. Jika data berada di sebelah kanan mempunyai kode 1, maka akan selalu diakhiri
dengan 0 sebagai pembatas untuk kode berikutnya. Jika data berada di sebelah kiri mempunyai kode 0, maka akan diakhiri dengan 1 sebagai pembatasnya.
Implementasi dari aturan tersebut dapat dilihat dengan penggunaan fungsi endsWithyang merupakan fungsi dari Java untuk mengecek apakah sebuah data
diakhiri oleh karakter yang ditentukan. Cara kerja dari proses encoding algoritma Huffman Modifikasi mirip
dengan proses pada algoritma Huffman Statis atau Huffman Dinamis,yaitu dengan mencocokan setiap karakter pada data teks dengan Arraylist Kode Huffman.
Perbedaandari ketiga algoritma, pada algoritma Huffman Modifikasi hanya ditambah dengan aturan pembatas.
4.1.5 Implementasi Proses Simpan File Hasil Kompresi
Proses selanjutnya adalah menyimpan sekumpulan kode biner hasil proses sebelumnya ke dalam bentuk file hasil dari kompresi. Pada proses ini setiap
kode biner akan di simpan dalam bentuk bit yang merupakan satuan terkecil dalam file. Proses ini penulis membuat menjadi tiga bagian yaitu proses
preprocessing, proses simpan file log dan proses simpan file kompresi. Ketiga proses tersebut diimplementasikan ke dalam tiga method yang semuanya berada di
kelas EncoderStream.java.
4.1.5.1 Implementasi Preprocessing
Gambar 4.14 Implementasi preprocessing
Ketiga proses yang terdapat pada tahap ini, proses inilah yang paling penting dan utama karena kode biner bertipe String tersebut akan dipecah menjadi
7 karakter. Dasar dari pemecahan ini, karena panjang maksimal setiap karakter menurut standar ASCII yaitu
8
= 256 bit atau ditulis dalam biner 10000000. Pemecahan menjadi 7 karakter ini berguna untuk mengantisipasi jika terdapat
kode biner yang lebih dari 256 bit. Sebagai contoh : Kode biner = 10000001001
Pemecahan 8 karakter = 10000001 001 Pemecahan 7 karakter = 1000000 1001
Jika dilakukan pemecahan 8 karakter maka akan membentuk sebuah karakter yang mempunyai nilai biner 257 atau lebih dari standar ASCII. Jika
terdapat sebuah karakter yang lebih dari 256 nilai binernya, maka standar harus diubah menjadi Unicode di mana panjang maksimal setiap karakter adalah
6
. Standar pembentukan karakter pada penelitian ini menggunakan ASCII.
Pada implementasi program, pemecahan dilakukan dengan ekspresi modulo. Setelah dilakukan pemecahan, program akan mengubah kode biner yang
bertipe String menjadi bertipe Integer dengan perintah Integer.parseIntString code,2. Perintah tersebut mempunyai arti mengubah data menjadi kode biner dan
hasilnya bertipe Integer. Angka 2 diambil dari bilangan yang di pangkat dalam penghitungan biner.
Setelah didapat kode biner yang sudah siap diproses, maka selanjutnya mencari karakter yang sesuai dengan kode biner nilai biner. Pencarian tersebut
menggunakan perintah new Charactercharint data. Perintah tersebut akan PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
secara otomatis mendapatkan karakter yang sesuai dengan nilai biner. Langkah terakhir adalah menyimpan karakter yang telah diperoleh ke dalam Arraylist
untuk diproses selanjutnya.
4.1.5.2 Implementasi Simpan File Log
Gambar 4.15 Implementasi proses simpan file log
Proses ini berfungsi untuk menyimpan data huruf dan kode biner yang baru berupa Arraylist dengan tipe kelas KodeHuffman.java. Pada method ini
menggunakan stream bertipe objek untuk memudahkan dalam menyimpannya supaya tidak terpisah antara data huruf dan kode biner.
File hasil disimpan dalam folder “logs” di dalam project dengan tipe data
.LDT yang merupakan singkatan dari Logs Data. Untuk nama menggunakan waktu saat file dibuat dengan format tanggal, bulan, tahun, jam, menit dan detik
yang digabung menjadi satu. Penamaan hingga satuan detik berguna untuk membuat file yang unik antara satu dengan yang lain.
4.1.5.3 Implementasi Simpan File Kompresi
Gambar 4.16 Implementasi proses simpan file kompresi
Proses selanjutnya berfungsi untuk menyimpan file hasil kompresi yang telah diubah kodenya ke dalam sebuah file baru bertipe .NFC yang telah dibahas
pada bab sebelumnya. Di dalam method ini menggunakan kelas dari Java yaitu PrintWriter yang merupakan salah satu cara dalam melakukan proses stream.
Salah satu keunggulan menggunakan kelas tersebuat adalah kita dapat menentukan tipe dari hasil encoding teks.
Dalam method tersebut menggunakan tipe “windows-1252” yang berarti
encoding yang digunakan menggunakan standard ANSI American National Standards Institute. Alasan saya menggunakan ANSI, karena pada skripsi ini
hanya menggunakan 8 bit atau dengan total hanya 256 kombinasi. Jika saya menggunakan tipe “utf-8” akan terlalu banyak bit yang tidak digunakan karena
dalam tipe tersebut menggunakan 32 bit. Pada method
tersebut terdapat kata “sb” yang digunakan sebagai pemisah dan merupakan singkatan dari sub. Pemisah ini digunakan untuk mempermudah
dalam proses decoding. Pemisah tersebut memisahkan nama file log, jenis algoritma yang digunakan dan isi dari kode biner yang baru.
4.2 Proses Decoding