Syaroni,M. & Munir,R. 2005. Pencocokan String Berdasarkan Kemiripan Ucapan (Phonetic
String Matching) dalam Bahasa Inggris.
Prosiding Seminar Nasional: SNATI UII
Yogyakarta, pp. 1-6.
Wibowo,T. 2012. Pembuatan Aplikasi Untuk Mendeteksi Kebenaran Perintah SQL Query
Menggunakan Metode Knuth-Morris-Pratt. Jurnal Teknik Informatika
1: 1-9
LISTING PROGRAM
// Source Code MainActivity.java
package id.repa;
import android.app.Activity;
import android.content.res.Configuration; import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout;
import android.view.MenuItem; import android.view.View;
import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener; public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout; private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle; private CharSequence mJudulDrawer;
private CharSequence mJudul; private String[] mNamaPlanet; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content);
// inisialisasi
mJudul = mJudulDrawer = getTitle(); mNamaPlanet =
getResources().getStringArray(R.array.array_drawer); mDrawerLayout = (DrawerLayout)
findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.drawer_kiri);
mDrawerList.setAdapter(new
ArrayAdapter(this,R.layout.item_navdrawer, mNamaPlanet));
// memberi event klik item item daftar nama planet
mDrawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View arg1, int posisi,
long id) {
// memanggil metode pilihItem() pilihItem(posisi);
} });
// membuka-menutup jika disentuh
getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true);
// merupakan metode untuk mengaktifkan drawer saat ikon ActionBar
// disentuh atau saat layar sebelah kiri digeser (sliding) ke kanan
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, 0, 0) {
// metode saat drawer dalam kondisi tertutup
// judul pada ActionBar menampilkan item buah terpilih public void onDrawerClosed(View view) {
getActionBar().setTitle(mJudul); invalidateOptionsMenu();
}
// metode saat drawer dalam kondisi terbuka
// judul pada ActionBar menampilkan nama aplikasi: // "Daftar Buah-buahan"
public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mJudulDrawer);
invalidateOptionsMenu(); }
};
// mDrawerLayout diberi event mDrawerToggle mDrawerLayout.setDrawerListener(mDrawerToggle);
// dalam keadaan awal, saat aplikasi mulai dijalankan, item yang dipilih
// adalah indeks 0
if (savedInstanceState == null) { pilihItem(0);
}
//new Data(new DbHelper(this)).insertAllWords1(); }
@Override
public boolean onOptionsItemSelected(MenuItem item) { // event saat ikon ActionBar disentuh: drawer akan membuka/menutup
if (mDrawerToggle.onOptionsItemSelected(item)) { return true;
}
return super.onOptionsItemSelected(item); }
private void pilihItem(int position) {
// metode saat item planet dipilih; judul pada ActionBar akan // diperbarui kemudian drawer akan menutup
switch(position) { case 0:
getFragmentManager().begintransaction().replace(R.id.frame_kont en, new MainFragment(), "MainFragment").commit();
case 1:
getFragmentManager().begintransaction().replace(R.id.frame_kont en, new kosaKata(), "kosaKata").commit();
break; case 2:
getFragmentManager().begintransaction().replace(R.id.frame_kont en, new About(), "About").commit();
break; }
mDrawerList.setItemChecked(position, true); setTitle(mNamaPlanet[position]);
mDrawerLayout.closeDrawer(mDrawerList); }
@Override
public void setTitle(CharSequence title) { // metode penggantian judul pada ActionBar mJudul = title;
getActionBar().setTitle(mJudul); }
// dua metode yang harus dipanggil saat menggunakan ActionBarDrawerToggle
// untuk penyesuaian dan konfigurasi kondisi drawer (item terpilih)
@Override
protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState(); }
@Override
public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig); }
}
// Source Code MainFragment.java
package id.repa;
import java.text.DecimalFormat; import java.util.ArrayList; import android.app.AlertDialog; import android.app.Fragment; import android.database.Cursor; import android.os.Bundle;
import android.text.Editable;
import android.view.LayoutInflater; import android.view.View;
import android.widget.EditText; import android.widget.ListView; import android.widget.Toast;
public class MainFragment extends Fragment implements android.text.TextWatcher,
android.widget.AdapterView.OnItemClickListener { private ArrayList<Result> results;
private ListView result; private DbHelper db; @Override
public View onCreateView (LayoutInflater inflater,ViewGroup root, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_main, root,false);
((EditText)
view.findViewById(R.id.editText1)).addTextChangedListener(this); result = (ListView) view.findViewById(R.id.result); result.setEmptyView(view.findViewById(R.id.empty)); result.setOnItemClickListener(this);
db = new DbHelper(getActivity()); return view;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
long first = System.nanoTime(); if(s.toString().equals(""))
result.setAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, new String[] { })); else {
String[] columns = { MyDictionaryContract.Word.COLUMN_ARTI, MyDictionaryContract.Word.COLUMN_ISTILAH };
Result[] R = {}; Cursor c =
db.getReadableDatabase().query(MyDictionaryContract.Word.TABLE_NAME, columns, null, null, null, null, null);
int i = 0, j = 0; if(c.moveToFirst()) {
R = new Result[c.getCount()]; do {
R[i++] = new
Result(c.getString(c.getColumnIndex(columns[0])), c.getString(c.getColumnIndex(columns[1])));
} while(c.moveToNext()); }
c.close();
if(R.length > 0) { results = new ArrayList<MainFragment.Result>();
String pattern = R[i].word;
search.search(pattern.toUpperCase(), s.toString().toUpperCase());
if(search.getMatches().length > 0) results.add(new Result(pattern, R[i].mean));
} i = 0;
String[] contents = new String[results.size()];
for(Result r : results)
contents[i++] = r.word; result.setAdapter(new
ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, contents)); }
}
long elapsed = System.nanoTime() - first; Toast.makeText(getActivity(), new
DecimalFormat("0.0000").format(elapsed / 1000000000.) + " s", Toast.LENGTH_SHORT).show();
}
@Override
public void afterTextChanged(Editable s) { } @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Result r = results.get(position); AlertDialog.Builder dialog = new
AlertDialog.Builder(getActivity()).setTitle(r.word).setMessage(r.mean );
dialog.show(); }
private class Result {
private Result(String word, String mean) { this.word = word;
this.mean = mean; }
private String word, mean; }
}
// Source Code SearchMethod.java
package id.repa;
import java.util.ArrayList; public class SearchMethod {
private char[] p, t; // pattern, text
private int m, n; // pattern length, text length private String matches; // string of match positions private char[] showmatches;// char array that shows matches private int[] b; // used by the KMP algorithm /** searches the text tt for the pattern pp
*/
setPattern(pp); kmpSearch(); }
/** sets the text */
private void setText(String tt) {
n=tt.length(); t=tt.toCharArray(); initmatches(); }
/** sets the pattern */
private void setPattern(String pp) {
m=pp.length(); p=pp.toCharArray(); b=new int[m+1]; kmpPreprocess(); }
/** initializes match positions and the array showmatches */
private void initmatches() {
matches="";
showmatches=new char[n]; for (int i=0; i<n; i++)
showmatches[i]=' '; }
/** preprocessing of the pattern */
private void kmpPreprocess() {
int i=0, j=-1; b[i]=j;
while (i<m) {
while (j>=0 && p[i]!=p[j]) j=b[j];
/** searches the text for all occurences of the pattern */
private void kmpSearch() {
int i=0, j=0; while (i<n) {
while (j>=0 && t[i]!=p[j]) j=b[j];
if (j==m) // a match is found
/** reports a match */
private void report(int i) {
matches += i + " "; showmatches[i]='^'; }
/** returns the match positions after the search */
public int[] getMatches() {
int i = 0, j = 0, n = matches.length();
ArrayList<String> list = new ArrayList<String>(); for(; i < n; i++) {
if(matches.charAt(i) == ' ') {
list.add(matches.substring(j, i)); j = i + 1;
} }
int[] result = new int[list.size()]; i = 0;
for(String s : list)
result[i++] = Integer.valueOf(s); return result;
} }
// Source Code kosaKata.java
package id.repa;
import java.util.ArrayList; import android.app.AlertDialog;
import android.content.ContentValues; import android.content.DialogInterface; import android.database.Cursor;
import android.os.Bundle; import android.view.MenuItem; import android.view.View;
import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast;
public class kosaKata extends android.app.ListFragment implements View.OnClickListener {
private DbHelper db;
private EditText istilah, arti;
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
reset(); }
public void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) {
menu.add(0, 0, 0,
R.string.add).setIcon(R.drawable.ic_add).setShowAsActionFlags(MenuIte m.SHOW_AS_ACTION_ALWAYS);
super.onCreateOptionsMenu(menu, inflater); }
public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId() == 0) {
new
AlertDialog.Builder(getActivity()).setTitle("Tambah istilah baru").setView(createInputView()).setPositiveButton("Tambah", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ContentValues values = new ContentValues();
values.put(MyDictionaryContract.Word.COLUMN_ARTI, istilah.getText().toString());
values.put(MyDictionaryContract.Word.COLUMN_ISTILAH, arti.getText().toString());
db.getWritableDatabase().insert(MyDictionaryContract.Word.TABLE _NAME, null, values);
android.widget.Toast.makeText(getActivity(), istilah.getText().toString() + " berhasil ditambah", android.widget.Toast.LENGTH_SHORT).show();
reset(); }
}).show(); }
return super.onOptionsItemSelected(item); }
public void onDestroy() { db.close();
super.onDestroy(); }
public void onClick(View v) {
final Result r = (Result) v.getTag(); switch(v.getId()) {
case R.id.delete: new
AlertDialog.Builder(getActivity()).setMessage("Hapus kata: " + r.word + "?").setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
_NAME, MyDictionaryContract.Word._ID + "=?", new String[] { String.valueOf(r.id) });
Toast.makeText(getActivity(), "Kata: " + r.word + " berhasil dihapus", Toast.LENGTH_SHORT).show();
reset(); }
}).show(); break; case R.id.edit:
View view = createInputView(); Cursor c =
db.getReadableDatabase().query(MyDictionaryContract.Word.TABLE_NAME, null, MyDictionaryContract.Word._ID + "=?", new String[] {
String.valueOf(r.id) }, null, null, null); if(c.moveToFirst()) {
arti.setText(c.getString(c.getColumnIndex(MyDictionaryContract. Word.COLUMN_ISTILAH)));
istilah.setText(c.getString(c.getColumnIndex(MyDictionaryContra ct.Word.COLUMN_ARTI)));
}
c.close(); new
AlertDialog.Builder(getActivity()).setTitle("Ubah kata: " + r.word).setView(view).setPositiveButton("Ubah", new
DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
ContentValues values = new ContentValues();
values.put(MyDictionaryContract.Word.COLUMN_ARTI, istilah.getText().toString());
values.put(MyDictionaryContract.Word.COLUMN_ISTILAH, arti.getText().toString());
db.getWritableDatabase().update(MyDictionaryContract.Word.TABLE _NAME, values, MyDictionaryContract.Word._ID + "=?", new String[] { String.valueOf(r.id) });
Toast.makeText(getActivity(), "Kata: " + r.word + " berhasil diubah", Toast.LENGTH_SHORT).show();
reset(); }
}).show(); break; }
}
private void reset() {
db = new DbHelper(getActivity()); android.database.Cursor c =
db.getWritableDatabase().query(MyDictionaryContract.Word.TABLE_NAME, null, null, null, null, null, MyDictionaryContract.Word.COLUMN_ARTI + " ASC");
ArrayList<Result> results = new ArrayList<kosaKata.Result>();
do {
results.add(new
Result(c.getLong(c.getColumnIndex(MyDictionaryContract.Word._ID)), c.getString(c.getColumnIndex(MyDictionaryContract.Word.COLUMN_ARTI)), c.getString(c.getColumnIndex(MyDictionaryContract.Word.COLUMN_ISTILAH ))));
} while(c.moveToNext()); }
c.close();
setListAdapter(new Adapter(results)); }
private View createInputView() {
LinearLayout view = new LinearLayout(getActivity()); view.setOrientation(LinearLayout.VERTICAL);
istilah = new EditText(getActivity()); istilah.setHint("Istilah");
arti = new EditText(getActivity()); arti.setHint("Arti");
view.addView(istilah, -1, -2); view.addView(arti, -1, -2); return view;
}
private class Adapter extends android.widget.ArrayAdapter<Result> {
private Adapter(ArrayList<Result> results) { super(getActivity(), 0, results); }
public View getView(int position, View convertView, android.view.ViewGroup root) {
if(convertView == null) { convertView =
android.view.LayoutInflater.from(getActivity()).inflate(R.layout.item _library, root, false);
((ImageView)
convertView.findViewById(R.id.delete)).setOnClickListener(kosaKata.th is);
((ImageView)
convertView.findViewById(R.id.edit)).setOnClickListener(kosaKata.this );
}
((TextView)
convertView.findViewById(R.id.word)).setText(getItem(position).word); ((ImageView)
convertView.findViewById(R.id.delete)).setTag(getItem(position)); ((ImageView)
convertView.findViewById(R.id.edit)).setTag(getItem(position)); return convertView;
} }
private class Result {
private Result(long id, String word, String mean) { this.id = id;
this.word = word; }
private String word; }
}
// Source Code DbHelper.java
package id.repa;
import android.content.ContentValues; import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import android.provider.BaseColumns;
public class DbHelper extends
android.database.sqlite.SQLiteOpenHelper {
public DbHelper(android.content.Context context) {
super(context, MyDictionaryContract.DATABASE_NAME, null, MyDictionaryContract.DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " +
MyDictionaryContract.Word.TABLE_NAME + "(" +
MyDictionaryContract.Word._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
MyDictionaryContract.Word.COLUMN_ISTILAH + " " + MyDictionaryContract.Word.COLUMN_TYPE_ISTILAH + "," +
MyDictionaryContract.Word.COLUMN_ARTI + " " + MyDictionaryContract.Word.COLUMN_TYPE_ARTI + ")");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DELETE TABLE IF EXISTS " + MyDictionaryContract.Word.TABLE_NAME);
onCreate(db); }
public long insert(String tableName, Word word) { ContentValues values = new ContentValues();
values.put(MyDictionaryContract.Word.COLUMN_ISTILAH, word.getIST());
values.put(MyDictionaryContract.Word.COLUMN_ARTI, word.getAR());
return
this.getWritableDatabase().insert(MyDictionaryContract.Word.TABLE_NAM E, null, values);
}
public Cursor getAllWords(String orderBy, String selection, String[] selectionArgs) {
return
this.getReadableDatabase().query(MyDictionaryContract.Word.TABLE_NAME , null, selection, selectionArgs, "", "", orderBy + " ASC");
public Word getWord(long ist) { Cursor c =
this.getReadableDatabase().query(MyDictionaryContract.Word.TABLE_NAME , null, MyDictionaryContract.Word._ID + " = ?", new String[] {
String.valueOf(ist) }, "", "", ""); Word word = null;
if(c.moveToFirst()) {
word = new Word(c.getString(1), c.getString(2)); word.set_ID(c.getLong(0));
}
return word; }
}
final class MyDictionaryContract {
public final static int DATABASE_VERSION = 1;
public final static String DATABASE_NAME = "DictMed.db"; public abstract static class Word implements BaseColumns {
public final static String TABLE_NAME = "Word",
COLUMN_ISTILAH = "Istilah", COLUMN_TYPE_ISTILAH = "VARCHAR(50) NOT NULL",
COLUMN_ARTI = "Arti", COLUMN_TYPE_ARTI = "VARCHAR(50) NOT NULL";
}
}
final class Word { private long _ID;
private String ist, ar;
public final static int LANG_IST = 0, LANG_AR = 1; private int lang = 0;
public Word(String ist, String ar) { this.ist = ar;
this.ar = ist; }
public void set_ID(long _ID) { this._ID = _ID;
}
public long get_ID() { return _ID; } public String getIST() { return ist; } public String getAR() { return ar; }
public void setLang(int lang) { this.lang = lang; } public int getLang() { return lang; }
public String toString() {
java.util.Locale locale = java.util.Locale.US; String temp = "";
temp =
String.valueOf(ist.charAt(0)).toUpperCase(locale);
return temp + ist.substring(1, ist.length()); case LANG_AR:
temp =
String.valueOf(ar.charAt(0)).toUpperCase(locale);
return temp + ar.substring(1, ar.length()); default: return null;
} }
}
// Source Code Data.java
package id.repa;
public class Data {
private DbHelper dbHelper;
public Data(DbHelper dbHelper) { this.dbHelper = dbHelper; } public void insertAllWords1() {
dbHelper.insert(MyDictionaryContract.Word.TABLE_NAME, new Word("ablasio retina","terpisahnya atau terlepasnya retina mata dari jaringan penyokong di bawahnya"));
dbHelper.insert(MyDictionaryContract.Word.TABLE_NAME, new Word("abses","kantong nanah akibat terinfeksi bakteri"));
dbHelper.insert(MyDictionaryContract.Word.TABLE_NAME, new Word("abses abdomen","abses perut"));
} }
// Source Code About.java package id.repa;
import android.app.Fragment; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.View;
import android.view.ViewGroup;
public class About extends Fragment { @Override
public View onCreateView (LayoutInflater inflater,ViewGroup root, Bundle savedInstanceState) {
return inflater.inflate(R.layout.activity_about, root,false); }
}
activity_main.xml
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_height="match_parent"
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_margintop="24dp"
android:ems="10"
android:hint="@string/masukkan_kata" android:inputType="text"
android:textColorLink="@color/black" android:textSize="20sp" />
<ListView
android:id="@+id/result"
android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/editText1" android:cacheColorHint="@color/redpa" /> <TextView
android:id="@+id/empty"