java Arrays.binarySearch() 在不区分大小写的搜索中找不到字符串
java Arrays.binarySearch() not able to find string in case insensitive search
我正在尝试使用 java.util.Arrays class 的二进制搜索(不区分大小写),但它无法搜索指定数组中存在的字符串。
下面是程序:
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");
}
}
下面是基于不同搜索字符串值的输出:
- searchString = "UTC" ---> 输出 = 未找到
- searchString = "america/los_angeles" ---> 输出 = 找到:America/Los_Angeles
如果我从 binarySearch 参数中删除 String.CASE_INSENSITIVE_ORDER 参数,那么也会找到 UTC。
我在这里错过了什么?我需要对该数组进行不区分大小写的搜索。
提前致谢!
在我的机器上,U
的时区 ID 顺序如下:
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, US/Michigan, US/Mountain, US/Pacific, US/Pacific-New, US/Samoa, UTC, Universal)
可以看到,Universal
在UTC
之后,所以在不区分大小写的情况下,这个是无序的,这种情况下不能使用binarySearch
。
我建议缓存 SortedSet
(TreeSet
),这些 ID 的顺序不区分大小写,并将其用于搜索。
Arrays.binarySearch() 在 JavaDoc 中指出,如果数组不是按升序排列,则结果未定义。问题是您使用与传递给 binarySearch 方法的不同的 Comparator 对数组进行排序。所以你的结果是未定义的......在这种情况下找不到。
将比较器传递给数组排序
Arrays.sort(arr, String.CASE_INSENSITIVE_ORDER);
它将按预期工作。
我正在尝试使用 java.util.Arrays class 的二进制搜索(不区分大小写),但它无法搜索指定数组中存在的字符串。 下面是程序:
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");
}
}
下面是基于不同搜索字符串值的输出:
- searchString = "UTC" ---> 输出 = 未找到
- searchString = "america/los_angeles" ---> 输出 = 找到:America/Los_Angeles
如果我从 binarySearch 参数中删除 String.CASE_INSENSITIVE_ORDER 参数,那么也会找到 UTC。 我在这里错过了什么?我需要对该数组进行不区分大小写的搜索。
提前致谢!
在我的机器上,U
的时区 ID 顺序如下:
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, US/Michigan, US/Mountain, US/Pacific, US/Pacific-New, US/Samoa, UTC, Universal)
可以看到,Universal
在UTC
之后,所以在不区分大小写的情况下,这个是无序的,这种情况下不能使用binarySearch
。
我建议缓存 SortedSet
(TreeSet
),这些 ID 的顺序不区分大小写,并将其用于搜索。
Arrays.binarySearch() 在 JavaDoc 中指出,如果数组不是按升序排列,则结果未定义。问题是您使用与传递给 binarySearch 方法的不同的 Comparator 对数组进行排序。所以你的结果是未定义的......在这种情况下找不到。
将比较器传递给数组排序
Arrays.sort(arr, String.CASE_INSENSITIVE_ORDER);
它将按预期工作。