Perbandingan Algoritma Knuth Morris Pratt dan Boyer Moore pada Aplikasi Kamus Bahasa Indonesia-Korea Berbasis Android

A-1

LAMPIRAN

LISTING PROGRAM

fragment_pencarian.xml















A-3




PencarianFragment.java
package com.vici.kamusindo_korea;
import
import
import
import
import
import
import
import
import
import
import
import
import

import
import
import

android.app.Fragment;
android.app.ProgressDialog;
android.content.Intent;
android.database.Cursor;
android.database.sqlite.SQLiteDatabase;
android.database.sqlite.SQLiteOpenHelper;
android.os.Bundle;
android.support.design.widget.FloatingActionButton;
android.util.Log;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.Button;
android.widget.EditText;
android.widget.TextView;
android.widget.Toast;


public class PencarianFragment extends Fragment {
View view;
SQLiteOpenHelper helper;
SQLiteDatabase db;
Cursor cursor;
private ProgressDialog pDialog;
String state = "Indo-Korea";
public PencarianFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup
container,Bundle savedInstanceState) {
// Inflate the layout for this fragment
view =
inflater.inflate(R.layout.fragment_pencarian,container,fal
se);
final TextView tv_indo =(TextView)
view.findViewById(R.id.textView);

final TextView tv_korea = (TextView)
view.findViewById(R.id.textView2);
final EditText et_input = (EditText)
view.findViewById(R.id.editText);
Button bt_kmp = (Button) view.findViewById(R.id.bt_kmp);

A-4

Button bt_bm = (Button) view.findViewById(R.id.bt_bm);
helper = new
DatabaseOpenHelper(getActivity().getBaseContext());
cursor = null;
bt_kmp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String pat = et_input.getText().toString();
if (pat.equals("")) {
Toast.makeText(getActivity(), "Masukan Masih
Kosong", Toast.LENGTH_SHORT).show();
} else {

Intent i = new Intent(getActivity(),
Hasil_KMP_Activity.class);
et_input.setText("");
i.putExtra("pat", pat);
i.putExtra("state", state);
startActivity(i);
}
});
bt_bm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String pat = et_input.getText().toString();
if (pat.equals("")) {
Toast.makeText(getActivity(), "Masukan Masih
Kosong", Toast.LENGTH_SHORT).show();
} else {
Intent i = new Intent(getActivity(),
Hasil_BM_Activity.class);
et_input.setText("");
i.putExtra("pat", pat);

i.putExtra("state", state);
startActivity(i);
}
});
FloatingActionButton fab = (FloatingActionButton)
view.findViewById(R.id.fab1);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String temp = tv_indo.getText().toString();
tv_indo.setText(tv_korea.getText().toString());
tv_korea.setText(temp);
if (state.equals("Indo-Korea")) state = "Korea-Indo";
else state = "Indo-Korea";
}
});
return view;
}

A-5


}

Hasil_KMP_Activity.java
package com.vici.kamusindo_korea;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

import
import
import

android.content.DialogInterface;
android.database.Cursor;
android.database.sqlite.SQLiteDatabase;
android.database.sqlite.SQLiteOpenHelper;
android.os.Bundle;
android.support.design.widget.FloatingActionButton;
android.support.design.widget.Snackbar;
android.support.v7.app.AlertDialog;
android.support.v7.app.AppCompatActivity;
android.support.v7.widget.Toolbar;
android.text.Html;
android.util.Log;
android.view.MenuItem;
android.view.View;
android.widget.AdapterView;
android.widget.ImageView;

android.widget.ListView;
android.widget.TextView;

import java.util.ArrayList;
import java.util.List;
public class Hasil_KMP_Activity extends AppCompatActivity {
View view;
SQLiteOpenHelper helper;
SQLiteDatabase db;
Cursor cursor;
double wMulai, wSelesai, wTotal;
public int jum = 0, jumB = 0;
String pat, state;
List resultList = new ArrayList();
private ListView listView;
private CustomListAdapter adapter;
String temp;
String[] TB = {"tbKamusFull"};
@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hasil__kmp_);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);//button
balik
getSupportActionBar().setHomeButtonEnabled(true);//button balik
getSupportActionBar().setTitle("Hasil Pencarian...");
pat = getIntent().getStringExtra("pat");
state = getIntent().getStringExtra("state");
getSupportActionBar().setSubtitle(pat);
listView = (ListView) findViewById(R.id.list);
adapter = new CustomListAdapter(this, resultList);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new

A-6

AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view,
int position, long id) {

String a, b;
String indonya = ((TextView)
view.findViewById(R.id.indonya)).getText().toString();
String koreanya = ((TextView)
view.findViewById(R.id.koreanya)).getText().toString();
ImageView imgnya = ((ImageView)
view.findViewById(R.id.imageView1));
ImageView imageView = new ImageView(getApplicationContext());
imageView.setImageDrawable(imgnya.getDrawable());
if (state.equals("Indo-Korea")) {
a = "Indonesia \t: ";
b = "Korea \t\t: ";
} else {
b = "Indonesia \t: ";
a = "Korea \t\t: ";
}
AlertDialog dialog = new
AlertDialog.Builder(Hasil_KMP_Activity.this)
.setView(imageView)
.setTitle("Terjemahan")
.setCancelable(false)
.setMessage(Html.fromHtml(a + "" + indonya + "" +
"" + b + "" + koreanya + ""))
.setPositiveButton("OK", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create();
dialog.show();
}
});
FloatingActionButton fab = (FloatingActionButton)
findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {hasil();
}
});
pat = getIntent().getStringExtra("pat");
pat = pat.toLowerCase();
state = getIntent().getStringExtra("state");
wMulai = System.currentTimeMillis();
startSearch(pat, state);
wSelesai = System.currentTimeMillis();
wTotal = wSelesai - wMulai;

A-7

temp = String.valueOf(wTotal);
}
public void hasil() {
AlertDialog dialog = new
AlertDialog.Builder(Hasil_KMP_Activity.this)
.setTitle("Hasil Knuth Morris Pratt")
.setMessage(Html.fromHtml(
"\nWaktu \t: " + temp + " ms" + "Jumlah \t:
" + jumB + " ditemukan"
))
.setPositiveButton("OK", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create();
dialog.show();
}
public void startSearch(String pattern, String states) {
String txt, txtIndo, txtKorea;
helper = new DatabaseOpenHelper(this);//ambil dtbase
cursor = null;
db = helper.getReadableDatabase();//read dibaca tnp
dirubah
resultList.clear();
jumB = 0;
for (int nama_tabel = 0; nama_tabel < TB.length;
nama_tabel++) {
cursor = db.rawQuery("SELECT * FROM " +
TB[nama_tabel] + " ORDER BY INDO ASC; ", null);
if (cursor != null) {
try {
cursor.moveToFirst();
do {
if (states.equals("Indo-Korea")) {
txtIndo = txt = cursor.getString(1);
txtKorea = cursor.getString(2);
} else {
txtIndo = txt = cursor.getString(2);
txtKorea = cursor.getString(1);
}
//start
KMP_start(txt, pattern, txtIndo,
txtKorea, cursor.getBlob(3));
} while (cursor.moveToNext());
} catch (Exception e) {
Log.d("Print", "catch startSearch");
}
}
}
try {
adapter = new CustomListAdapter(this, resultList);
listView.setAdapter(adapter);
} catch (Exception e) {

A-8

Log.d("Print", "catch update list");
}
db.close();
}
// Knuth Morris Pratt
static String txt;
static String patt;
static String Indo;
static String Korea;
static byte[] Image;
static char[] x;
static char[] y;
static int n;
static int m;
static int[] kmpNext;
public void KMP_start(String getTxt, String getPatt, String
getIndo, String getKorea, byte[] getImage) {
txt = getTxt;
patt = getPatt;
Indo = getIndo;
Korea = getKorea;
Image = getImage;
x = patt.toCharArray();
y = txt.toCharArray();
n = txt.length();
m = patt.length();
kmpNext = new int[m + 1];
KMP();
}
public static void preKmp() {
int i, j;
i = 0;
j = kmpNext[0] = -1;
while (i < m) {
while (j > -1 && x[i] != x[j]) {
j = kmpNext[j];
}
i++;
j++;
if (i < m && j < m && x[i] == x[j]) {
kmpNext[i] = kmpNext[j];
} else {
kmpNext[i] = j;
}
}
}
public void KMP() {
int i, j;
/* Pre-processing */
preKmp();
/* Searching */
// compare blm pas

A-9

i = j = 0;
while (j < n) {
while (i > -1 && x[i] != y[j]) {
i = kmpNext[i];
}
i++;
j++;
if (i >= m) {
// System.out.println(" Result = " + (j - i));
int pos = (j - i);
i = kmpNext[i];
jumB++;
Result m = new Result();
m.setIndo(Indo);
m.setKorea(Korea);
m.setImage(Image);
m.setPos(pos);
m.setPat(patt);
resultList.add(m);
Log.d("Print", "masuk KMP");
}
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
this.finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}

activity_hasil_kmp.xml






A-10

Hasil_BM_Activity.java
package com.vici.kamusindo_korea;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

android.content.DialogInterface;
android.database.Cursor;
android.database.sqlite.SQLiteDatabase;
android.database.sqlite.SQLiteOpenHelper;
android.os.Bundle;
android.support.design.widget.FloatingActionButton;
android.support.v7.app.AlertDialog;
android.support.v7.app.AppCompatActivity;
android.support.v7.widget.Toolbar;
android.text.Html;
android.util.Log;
android.view.MenuItem;
android.view.View;
android.widget.AdapterView;
android.widget.ImageView;
android.widget.ListView;
android.widget.TextView;

import java.util.ArrayList;
import java.util.List;
public class Hasil_BM_Activity extends AppCompatActivity {
View view;
SQLiteOpenHelper helper;
SQLiteDatabase db;
Cursor cursor;
double wMulai, wSelesai, wTotal;
public int jum = 0, jumB = 0;
String pat, state;
List resultList = new ArrayList();
private ListView listView;
private CustomListAdapter adapter;
String temp;
String[] TB = {"tbKamusFull"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hasil__bm_);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);//button
balik
getSupportActionBar().setHomeButtonEnabled(true);//button balik
getSupportActionBar().setTitle("Hasil Pencarian...");
pat = getIntent().getStringExtra("pat");
state = getIntent().getStringExtra("state");
getSupportActionBar().setSubtitle(pat);
listView = (ListView) findViewById(R.id.list);
adapter = new CustomListAdapter(this, resultList);
listView.setAdapter(adapter);

A-11

listView.setOnItemClickListener(new
AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view,
int position, long id) {
String a, b;
String indonya = ((TextView)
view.findViewById(R.id.indonya)).getText().toString();
String koreanya = ((TextView)
view.findViewById(R.id.koreanya)).getText().toString();
ImageView imgnya = ((ImageView)
view.findViewById(R.id.imageView1));
ImageView imageView = new ImageView(getApplicationContext());
imageView.setImageDrawable(imgnya.getDrawable());
if (state.equals("Indo-Korea")) {
a = "Indonesia \t: ";
b = "Korea \t\t: ";
} else {
b = "Indonesia \t: ";
a = "Korea \t\t: ";
}
AlertDialog dialog = new
AlertDialog.Builder(Hasil_BM_Activity.this)
.setView(imageView)
.setTitle("Terjemahan")
.setCancelable(false)
.setMessage(Html.fromHtml(a + "" +
indonya + "" + "" + b + "" + koreanya + ""))
.setPositiveButton("OK", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface
dialog, int which) {
dialog.dismiss();
}
}).create();
dialog.show();
}
});
FloatingActionButton fab = (FloatingActionButton)
findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
hasil();
}
});
pat = getIntent().getStringExtra("pat");
pat = pat.toLowerCase();
state = getIntent().getStringExtra("state");

A-12

wMulai = System.currentTimeMillis();
startSearch(pat, state);
wSelesai = System.currentTimeMillis();
wTotal = wSelesai - wMulai;
temp = String.valueOf(wTotal);
}
public void hasil() {
AlertDialog dialog = new
AlertDialog.Builder(Hasil_BM_Activity.this)
.setTitle("Hasil Boyer Moore")
.setMessage(Html.fromHtml(
"\nWaktu \t: " + temp + " ms" +
"Jumlah \t: " + jumB + " ditemukan"
))
.setPositiveButton("OK", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create();
dialog.show();
}
public void startSearch(String pattern, String states) {
String txt, txtIndo, txtKorea;
helper = new DatabaseOpenHelper(this);
cursor = null;
db = helper.getReadableDatabase();
resultList.clear();
jumB = 0;
for (int nama_tabel = 0; nama_tabel < TB.length;
nama_tabel++) {
cursor = db.rawQuery("SELECT * FROM " +
TB[nama_tabel] + " ORDER BY INDO ASC; ", null);
if (cursor != null) {
try {
cursor.moveToFirst();
do {
if (states.equals("Indo-Korea")) {
txtIndo = txt = cursor.getString(1);
txtKorea = cursor.getString(2);
} else {
txtIndo = txt = cursor.getString(2);
txtKorea = cursor.getString(1);
}
//start
BM_start(txt, pattern, txtIndo, txtKorea,
cursor.getBlob(3));
} while (cursor.moveToNext());
} catch (Exception e) {
Log.d("Print", "catch startSearch");
}
}
}

A-13

try {
adapter = new CustomListAdapter(this, resultList);
listView.setAdapter(adapter);
} catch (Exception e) {
Log.d("Print", "catch update list");
}
db.close();
}
//Boyer Moore
static String txtB;
static String patB;
static char[] xB;
static char[] yB;
static int nB;
static int mB;
static
static
static
static
static
static

String IndoB;
String KoreaB;
byte[] ImageB;
int[] suf = new int[256];
int[] bmBc = new int[256];
int[] bmGs = new int[256];

public void BM_start(String getTxt, String getPat, String
getIndo, String getKorea, byte[] getImage) {
txtB = getTxt;
patB = getPat;
IndoB = getIndo;
KoreaB = getKorea;
ImageB = getImage;
xB = patB.toCharArray();
yB = txtB.toCharArray();
nB = txtB.length();
mB = patB.length();
BM();
}
public static void preBmBc()
for (int i = 0; i < 256;
bmBc[i] = mB;
}
for (int i = 0; i < mB bmBc[xB[i]] = mB - i
}
}

{
++i) {
1; ++i) {
- 1;

public static void suffixes() {
int f = 0;
int g;
suf[mB - 1] = mB;
g = mB - 1;
for (int i = mB - 2; i >= 0; --i) {
if (i > g && suf[i + mB - 1 - f] < i - g) {
suf[i] = suf[i + mB - 1 - f];
} else {
if (i < g) {

A-14

g = i;
}
f = i;
while (g >= 0 && xB[g] == xB[g + mB - 1 - f]) {
--g;
}
suf[i] = f - g;
}
}
}
public static void preBmGs() {
suffixes();
for (int i = 0; i < mB; ++i) {
bmGs[i] = mB;
}
int j = 0;
for (int i = mB - 1; i >= 0; --i) {
if (suf[i] == i + 1) {
for (; j < mB - 1 - i; ++j) {
if (bmGs[j] == mB) {
bmGs[j] = mB - 1 - i;
}
}
}
}
for (int i = 0; i