Friday, August 15, 2014

Mencari data terduplikasi dengan menggunakan Java HashMap

Dalam tutorial kali ini, saya mencoba mendemonstrasikan kegunaan hashmap di java, yakni dalam mencari tahu apakah suatu data terduplikasi. Contohnya adalah biasa dalam sebuah database berbasis SQL ada perintah distinct yang mana secara kasar bisa dikatakan bahwa perintah ini menggunakan hashmap dalam implementasinya.

Saya berikan contoh, adalah bagaimana mencari dalam suatu file pada baris ke berapa saja kolom ke-x mengalami duplikasi. Sebenarnya ini perluasan dari pertanyaan fundamental yakni, apakah suatu data memiliki jumlah lebih dari satu dalam suatu kumpulan data. Kemudian saya melakukan perluasan dengan memberikan jawaban mengenai di baris mana saja data tersebut mengalami duplikasi. Potongan kodenya dapat dilihat pada script berikut:

// untuk memeriksa data pada kolom ke-x yang mengalami duplikasi
static void checkUnik(BufferedReader reader, BufferedWriter writer ) throws IOException {
HashMap<String, Integer> map = new HashMap<String, Integer>() ;
HashMap< String, ArrayList<Integer>> listMap = new HashMap<>();
HashMap<Integer, String[]> lineMap = new HashMap<Integer, String[]>();
String result;
int numberLine = 1;
while((result = reader.readLine()) != null){
String[] splitter = result.split(regexSplitter);
String search_string = splitter[6];
if(map.get(search_string) == null ){
map.put(search_string, 1);
ArrayList<Integer> listInteger = new ArrayList<>();
listInteger.add(numberLine);
listMap.put(search_string , listInteger );
}else{
int jumlah = map.get(search_string);
map.replace(search_string, ++jumlah);
ArrayList<Integer> list = listMap.get(search_string);
list.add(numberLine);
}
lineMap.put(numberLine, splitter);
numberLine++;
}
// untuk mengecek apakah data pada kolom ke-x terduplikasi
writer.write("untuk mengecek apakah id yang bersangkutan terduplikasi\n");
for(Entry<String, Integer> entri : map.entrySet()){
if(entri.getValue() > 1){
String output = "key: "+ entri.getKey() + " value: "+ entri.getValue() + "\n" ;
writer.write(output);
}
}
// untuk mengecek (karena terduplikasi) di baris mana saja data (kolom ke-x) tersebut berada...
writer.write("\nuntuk mengecek ada dibagian mana saja id tersebut berada...\n");
for(Entry<String, ArrayList<Integer>> entri : listMap.entrySet()){
ArrayList<Integer> list = entri.getValue();
if(list.size() > 1){
String output = "Key: "+ entri.getKey() + " ada pada baris:\t";
for( Integer line : list){
output += line + "\t";
}
output+= "\n";
writer.write(output);
}
}
// untuk memeriksa situasi baris di mana data kolom ke-x terduplikasi
writer.write("\nmemeriksa situasi baris yang terduplikas\n");
for(Entry<String, ArrayList<Integer>> entri : listMap.entrySet() ){
ArrayList<Integer> list = entri.getValue();
if(list.size() > 1){
for(Integer line: list){
String[] ss = lineMap.get(line);
String out = entri.getKey()+ "\t" + Integer.toString(line)+":\t";
for(String s: ss){
out += s + "\t";
}
out += "\n";
writer.write(out);
}
}
}
// untuk mencari tahu apakah pada baris di mana data kolom ke-x terduplikasi
// masih ada data untuk kolom yang lain selain kolom ke-x yang terduplikasi
writer.write("\nuntuk mencari tahu apakah di dalam entri yang terduplikasi masih ada duplikasi yang lain\n");
for(Entry<String, ArrayList<Integer>> entri: listMap.entrySet()){
ArrayList<Integer> list = entri.getValue();
if ( list.size() > 1){
HashMap<String, ArrayList<Integer>> secondMap = new HashMap<>();
for(Integer line : list){
String[] splitter = lineMap.get(line);
String search_string_second = splitter[0];
if(secondMap.get(search_string_second) == null){
ArrayList<Integer> listInteger = new ArrayList<>();
listInteger.add(line);
secondMap.put(search_string_second, listInteger );
}else{
ArrayList<Integer> list_3 = secondMap.get(search_string_second);
list_3.add(line);
}
}
for(Entry<String, ArrayList<Integer>> entri_2 : secondMap.entrySet()){
if(entri_2.getValue().size() > 1){
String s = entri.getKey() + ":\t" + entri_2.getKey() + ":\t";
for(Integer line_1 : entri_2.getValue()){
s+= line_1 + "\t";
}
s+= "\n";
writer.write(s);
}
}
}
}
}
Untuk mendemonstrasikan apakah script ini berjalan dengan baik, ada baiknya pembaca membuat sendiri test-case nya. Buat aja beberapa baris yang data pada kolom-kolomnya itu beda, kecuali pada beberapa kolom yang dibuat sama. Kemudian selanjutnya pembaca jalankan aja script ini untuk mengetesnya.