private int tebakKitab(Book[] xkitab) { if (p_kitab == null) { return -1; } int res = -1; // 0. bikin cache semua judul kitab yang dibuang spasinya dan dikecilin semua dan 1 jadi I, 2 // jadi II, dst { Jumper.KitabRef[] refs = pendekCache.get(xkitab); if (refs == null) { ArrayList<Jumper.KitabRef> a = new ArrayList<Jumper.KitabRef>(); for (Book k : xkitab) { String judul = k.judul.replaceAll("(\\s|-|_)+", "").toLowerCase(); // $NON-NLS-1$ //$NON-NLS-2$ { Jumper.KitabRef ref = new KitabRef(); ref.pendek = judul; ref.pos = k.bookId; a.add(ref); } if (judul.contains("1") || judul.contains("2") || judul.contains("3")) { // $NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ judul = judul .replaceAll("1", "i") .replaceAll("2", "ii") .replaceAll( "3", "iii"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$ //$NON-NLS-5$ // //$NON-NLS-6$ Jumper.KitabRef ref = new KitabRef(); ref.pendek = judul; ref.pos = k.bookId; a.add(ref); } } refs = a.toArray(new Jumper.KitabRef[0]); pendekCache.put(xkitab, refs); Log.d(TAG, "entri pendekCache baru: " + Arrays.toString(refs)); // $NON-NLS-1$ } } // 0 juga. bersihin p_kitab Jumper.KitabRef[] refs = pendekCache.get(xkitab); p_kitab = p_kitab.replaceAll("(\\s|-|_)", "").toLowerCase(); // $NON-NLS-1$ //$NON-NLS-2$ Log.d(TAG, "tebakKitab fase 0: p_kitab = " + p_kitab); // $NON-NLS-1$ // 1. coba cocokin keseluruhan (co: "kejadian", "yohanes") for (Jumper.KitabRef ref : refs) { if (ref.pendek.equals(p_kitab)) { Log.d(TAG, "tebakKitab fase 1 sukses: " + p_kitab); // $NON-NLS-1$ return ref.pos; } } // 2. coba cocokin depannya, kalo ada 1 doang yang lulus, sukses int pos_buatNanti = -1; { int lulus = 0; for (Jumper.KitabRef ref : refs) { if (ref.pendek.startsWith(p_kitab)) { lulus++; if (lulus == 1) pos_buatNanti = ref.pos; } } if (lulus == 1) { Log.d( TAG, "tebakKitab fase 2 sukses: " + pos_buatNanti + " untuk " + p_kitab); //$NON-NLS-1$ //$NON-NLS-2$ return pos_buatNanti; } else { Log.d(TAG, "tebakKitab fase 2: lulus = " + lulus); // $NON-NLS-1$ } } // 3. String matching hanya kalo p_kitab 2 huruf ato lebih if (p_kitab.length() >= 2) { int minSkor = 99999999; int pos = -1; for (Jumper.KitabRef ref : refs) { int skor = Levenshtein.distance(p_kitab, ref.pendek); if (p_kitab.charAt(0) != ref.pendek.charAt(0)) { skor += 150; // kira2 1.5 insertion } Log.d( TAG, "tebakKitab fase 3: dengan " + ref.pendek + ":" + ref.pos + " skor " + skor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ if (skor < minSkor) { minSkor = skor; pos = ref.pos; } } if (pos != -1) { Log.d( TAG, "tebakKitab fase 3 sukses: " + pos + " dengan skor " + minSkor); //$NON-NLS-1$//$NON-NLS-2$ return pos; } } // 7. Keluarin yang pertama cocok kalo ada lebih dari 1 yang lulus fase 2 if (pos_buatNanti != -1) { Log.d( TAG, "tebakKitab fase 7 sukses: " + pos_buatNanti + " untuk " + p_kitab); //$NON-NLS-1$ //$NON-NLS-2$ return pos_buatNanti; } return res; }