我正在尝试使用java.util.Arrays类的二进制搜索(不区分大小写),但它无法搜索指定数组中存在的String。 以下是该计划:
package com.test;
import java.util.Arrays;
import java.util.TimeZone;
public class TestArrayBinSearch {
public static void main(String[] args) {
String arr[] = TimeZone.getAvailableIDs();
Arrays.sort(arr);
String searchString = "UTC";
int index = Arrays.binarySearch(arr, searchString, String.CASE_INSENSITIVE_ORDER);
if(index >= 0)
System.out.println("Found: " + arr[index]);
else
System.out.println("Not Found");
}
}
以下是基于搜索字符串的不同值的输出:
如果从binarySearch参数中删除String.CASE_INSENSITIVE_ORDER参数,则还会找到UTC。 我在这里错过了什么?我需要对这个数组进行不区分大小写的搜索。
提前致谢!
答案 0 :(得分:1)
在我的机器上,时区ID的顺序如下U
:
java.util.TimeZone.getAvailableIDs.filter(_.startsWith("U"))
res0:Array [String] = Array(UCT,US / Alaska,US / Aleutian,US / Arizona,US / Central,US / East-Indiana,US / Eastern,US / Hawaii,US / Indiana-Starke,美国/密歇根州,美国/山区,美国/太平洋,美国/太平洋 - 新,美国/萨摩亚,UTC,环球)
正如您所看到的,Universal
位于UTC
之后,因此在不区分大小写的情况下,这不是有序的,在这种情况下您不能使用binarySearch
。
我建议使用这些ID的不区分大小写的顺序缓存SortedSet
(TreeSet
)并将其用于搜索。
答案 1 :(得分:1)
Arrays.binarySearch()在JavaDoc中声明,如果数组不是按升序排列,则结果是未定义的。问题是您使用与传递给 binarySearch 方法的 Comparator 不同的 Comparator 对数组进行排序。所以你的结果是未定义的......在这种情况下找不到。
将比较器传递给数组排序
Arrays.sort(arr, String.CASE_INSENSITIVE_ORDER);
它将按预期工作。