簡體   English   中英

binarySearch與自定義Comparator-object不檢查第一個元素

[英]binarySearch with custom Comparator-object not checking first element

我正在嘗試使用java.util.Arrays.binarySearch創建自定義Comparator對象。

我想在數組中搜索一個String,它的反向值等於目標String元素的反向值(啞,我知道,但它只是為了學習)。

但是,當我嘗試在數組上運行binarySearch時,除了數組元素0之外,所有元素都正確匹配。

比較:

class SearchComparator<T extends Comparable<T>> implements Comparator<T> {
    public int compare(T s1, T s2) {

        String reverse1 = new StringBuilder((String)s1).reverse().toString();
        String reverse2 = new StringBuilder((String)s2).reverse().toString();

        return reverse1.equals(reverse2) ? 0 : -1;
    }
}

主功能:

String[] words = new String[]{"One", "Two", "Three", "Four"};
SearchComparator scmp = new SearchComparator();

System.out.println(Arrays.deepToString(words));

System.out.println(Arrays.binarySearch(words, "One", scmp));
System.out.println(Arrays.binarySearch(words, "Two", scmp));
System.out.println(Arrays.binarySearch(words, "Three", scmp));
System.out.println(Arrays.binarySearch(words, "Four", scmp));

輸出:

[One, Two, Three, Four]
-5
1
2
3

什么是-5 我不認識男人。

來自Comparator<T>接口的int compare(T s1, T s2)返回一個數字,表示s1是小於,等於還是大於s2 ; 你的代碼比較s1s2是否相等,這是不正確的。

您需要更改代碼的return行以調用String對象的字典比較方法,如下所示:

return reverse1.compareTo(reverse2);

另一個問題是您的數組沒有按照相同的比較器進行排序。 這就是您在搜索時獲得負索引的原因。 在調用binarySearch之前添加此行以解決問題:

Arrays.sort(words, scmp);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM