[英]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.