簡體   English   中英

如何使用比較器執行 binarySearch?

[英]How to perform a binarySearch with a comparator?

我正在嘗試使用不區分大小寫的比較器執行二進制搜索,但無論我嘗試什么,我都會遇到錯誤......

試驗一:

Arrays.binarySearch(arr, "text", String::compareToIgnoreCase);

資料來源: https://stackoverflow.com/a/30191946/900394

這給出了一個錯誤:

語言級別“7”不支持方法引用

假設我想使用 Java 7,我嘗試了以下其他方法:

試驗 2

Comparator<String> caseInsensitiveComparator = new Comparator<String>() {
        @Override
        public int compare(String s, String t1) {
            return s.compareToIgnoreCase(t1);
        }
    };

Arrays.binarySearch(arr, "text", caseInsensitiveComparator);

資料來源: https://stackoverflow.com/a/14154185/900394

錯誤:

所需類型:比較器<? 超級對象>
提供:比較器

請注意,此方法適用於對列表進行排序(即此比較器適用於Collections.sort()

試驗 3:

Arrays.binarySearch(arr, "text", String.CASE_INSENSITIVE_ORDER);

來源: https://stackoverflow.com/a/17491652/900394

錯誤:

所需類型:比較器<? 超級對象>
提供:比較器

請注意,此方法也適用於Collections.sort()

試驗四:

構建一個實現Comparator<String>的 class :

public class CaseInsensitiveComparatorClass implements Comparator<String> {

    @Override
    public int compare(String s, String t1) {
        return s.compareToIgnoreCase(t1);
    }
}

Arrays.binarySearch(arr, "text", new CaseInsensitiveComparatorClass ());

資料來源: https://stackoverflow.com/a/30191797/900394

錯誤:

所需類型:比較器<? 超級 java.lang.Object>
提供:CaseInsensitiveComparatorClass

請注意,此方法也適用於Collections.sort()

您能否為我提供一種有效的方法,或者指出我做錯了什么?


編輯:

這是arr的聲明:

private List<String> lst;

所以它實際上是一個列表,我在方法調用時將其轉換為數組:

Arrays.binarySearch(lst.toArray(),...

regarding your first example, you use method reference feature from Java 8 ( String::compareToIgnoreCase ), but you compile/execute code with Java 7. change version of Java at least to Java 8. also keep in mind, that before using Arrays.binarySearch ,你的數組應該被排序。

對於收集,您可以使用以下方法: Collections.binarySearch()

為了將列表轉換為具有泛型參數的數組,請使用以下命令:

lst.toArray(new String[0]);

您實際上有一個列表,而不是一個數組: List<String> 使用Collections.binarySearch而不是將列表轉換為數組,然后是Arrays.binarySearch

List<String> lst = Arrays.asList("a", "text", "z"); // just an example list
int index = Collections.binarySearch(lst, "text", String.CASE_INSENSITIVE_ORDER);

如果出於某種愚蠢的原因您必須使用Arrays.binarySearch ,您可以將具體列表類型作為參數傳遞給List.toArray 這將使該方法返回一個字符串數組而不是一個對象數組:

Arrays.binarySearch(lst.toArray(new String[0]), String.CASE_INSENSITIVE_ORDER)

注意數組要按照 Arrays.binarySearch Javadoc 排序:

使用二分搜索算法在指定數組中搜索指定的 object。 在進行此調用之前,必須根據指定的比較器(如通過 sort(T[], Comparator) 方法)對數組進行升序排序。 如果未排序,則結果未定義。 如果數組包含多個等於指定 object 的元素,則無法保證會找到哪一個。

String 本身實現了 Comparable 接口,所以,沒有必要實現一個新的

這是可視化如何使用 Arrays.binarySearch 的簡短代碼片段。

public class BinarySearch {
    public static void main(String[] args) {
        final String[] arr = {"one", "two", "three", "four", "text"};

        Arrays.sort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
        System.out.println(Arrays.binarySearch(arr, "text", String.CASE_INSENSITIVE_ORDER));
    }
}

試試這個代碼:

    String[] arr = {"a","b","c"};

    int i = Arrays.binarySearch(arr, "B", new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.compareToIgnoreCase(o2);
        }
    });

    System.out.println(i);

暫無
暫無

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

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