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

ful*_*ead 2 java string collections binary-search

所以我正在搜索一个巨大的ArrayList以查找特定的String值,但是如果我要查找的String与我传入的String相等(不区分大小写),则需要Collections.binarySearch()返回> = 0的值。 binarySearch()方法。

现在,在Collections.binarySearch()的源代码中,它最终将调用以下代码行。

 Comparable<? super T> midVal = list.get(mid);
 int cmp = midVal.compareTo(key);
Run Code Online (Sandbox Code Playgroud)

如此看来,我无法覆盖String作为其最终值(因此防止我覆盖其compareTo()方法以调用compareToIgnoreCase()),还有其他方法可以实现吗?

任何帮助将非常感谢。

Ale*_*you 5

要执行不区分大小写的二进制搜索,请String::compareToIgnoreCase用作比较器:

int i = Collections.binarySearch(list, key, String::compareToIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

这将比比较减少到相同大小写的两个字符串更快,因为compareToIgnoreCase()逐个比较字符,仅在需要时才减少字符的大小写,如果第一个字符中的字符串不同,则可以快速返回。

注意:要使binarySearch()此比较器正常工作,必须使用完全相同的比较器对集合进行排序

Collections.sort(list, String::compareToIgnoreCase);
Run Code Online (Sandbox Code Playgroud)