簡體   English   中英

使Collections.binarySearch()與compareToIgnoreCase一起使用?

[英]Making Collections.binarySearch() work with compareToIgnoreCase?

所以我正在搜索一個巨大的ArrayList以查找特定的String值,但是如果我要查找的String與我傳入的String相等(不區分大小寫),則需要Collections.binarySearch()返回> = 0的值。 binarySearch()方法。

現在,在Collections.binarySearch()的源代碼中,它最終將調用以下代碼行。

 Comparable<? super T> midVal = list.get(mid);
 int cmp = midVal.compareTo(key);

如此看來,我無法覆蓋String作為最終變量(因此防止我覆蓋其compareTo()方法來調用compareToIgnoreCase()),還有其他方法可以實現嗎?

任何幫助將非常感謝。

要執行不區分大小寫的二進制搜索,請使用String::compareToIgnoreCase作為比較器:

int i = Collections.binarySearch(list, key, String::compareToIgnoreCase);

這將比比較兩個減少為相同大小寫的字符串的執行速度更快,因為compareToIgnoreCase()一一比較字符,僅在需要時才減少字符的大小寫,如果字符串中的第一個字符不同,則可以快速返回。

注意:為了使binarySearch()在此比較器中正常工作, 必須使用完全相同的比較器對集合進行排序

Collections.sort(list, String::compareToIgnoreCase);

使用外部比較器,因為java.util.Collections具有帶有此簽名的binarySearch方法:

public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)

您的比較器看起來像

public class CaseInsensitiveComparator implements Comparator<String> {
    public int compare(String s1, String s2) {
      // check if any of the arguments are null, otherwise
      return s1.toLowerCase().compareTo(s2.toLowerCase());
    }
}

即使您可以擴展String來覆蓋compareTo方法,我也不認為這是一個好主意。

暫無
暫無

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

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