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");
    }
}

下面是基于不同搜索字符串值的输出:

如果我从 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)

可以看到,UniversalUTC之后,所以在不区分大小写的情况下,这个是无序的,这种情况下不能使用binarySearch

我建议缓存 SortedSet (TreeSet),这些 ID 的顺序不区分大小写,并将其用于搜索。

Arrays.binarySearch() 在 JavaDoc 中指出,如果数组不是按升序排列,则结果未定义。问题是您使用与传递给 binarySearch 方法的不同的 Comparator 对数组进行排序。所以你的结果是未定义的......在这种情况下找不到。

将比较器传递给数组排序

Arrays.sort(arr, String.CASE_INSENSITIVE_ORDER);

它将按预期工作。