java Arrays.binarySearch()无法在不区分大小写的搜索中找到字符串

时间:2016-07-26 09:49:42

标签: java arrays sorting java-7 binary-search

我正在尝试使用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");
    }
}

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

  • searchString =“UTC”--->输出=未找到
  • searchString =“america / los_angeles”--->输出=发现:America / Los_Angeles

如果从binarySearch参数中删除String.CASE_INSENSITIVE_ORDER参数,则还会找到UTC。 我在这里错过了什么?我需要对这个数组进行不区分大小写的搜索。

提前致谢!

2 个答案:

答案 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的不区分大小写的顺序缓存SortedSetTreeSet)并将其用于搜索。

答案 1 :(得分:1)

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

将比较器传递给数组排序

Arrays.sort(arr, String.CASE_INSENSITIVE_ORDER);

它将按预期工作。