我正试图用不区分大小写的比较器执行二分搜索,但无论我怎么做,我总是得到错误。。。
试验1:
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()
试验4:
生成实现比较器
的类:
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
错误:
必填类型:比较器<;? super java.lang.Object>
提供:CaseInsensitiveComparatorClass
请注意,此方法也在处理collections.sort()
你能给我提供一个有效的方法吗?或者指出我做错了什么?
编辑:
这是arr
的声明:
个人专用列表
所以它实际上是一个列表,我在方法调用时将其转换为数组:
Arrays.BinarySearch(lst.ToArray(),...
关于您的第一个示例,您使用了Java 8中的方法引用特性(String::CompareToIgnoreCase
),但是您用Java 7编译/执行代码。 把《Java》的版本至少改成《Java 8》。 还要记住,在使用Arrays.BinarySearch
之前,应该对数组进行排序。
对于集合,可以使用以下方法:Collections.BinarySearch()
为了将列表转换为带有泛型参数的数组,请使用以下方法:
lst.ToArray(新字符串[0]);
注意,应该根据数组对数组进行排序。binarySearch javadoc:
使用二分搜索算法在指定数组中搜索指定对象。 在进行此调用之前,必须根据指定的比较器(如sort(t[],comparator)方法)将数组按升序排序。 如果不对其进行排序,则结果是未定义的。 如果数组包含多个与指定对象相等的元素,则无法保证会找到哪一个。
字符串本身实现了可比性接口,因此,不需要实现新的接口
下面是可视化如何使用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);