예제 #1
0
  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;
  }