2016-07-26 85 views
0

我试图使用java.util.Arrays类的二进制搜索(不区分大小写),但它无法搜索存在于数组指定。 下面是该程序:java Arrays.binarySearch()无法在不区分大小写的搜索中找到字符串

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” --->输出=未找到
  • 搜索字符串=“美国/洛杉矶“---> output = Found:America/Los_Angeles

如果我从binarySearch参数中删除String.CASE_INSENSITIVE_ORDER参数,则UT C也被发现。 我在这里错过了什么?我需要对这个数组进行不区分大小写的搜索。

在此先感谢!

+1

“TimeZone.getAvailableIDs”中的值的大小顺序可能区分大小写,而不是大小写不敏感的顺序,所以它不能以这种方式找到它。 –

回答

1

Arrays.binarySearch()在JavaDoc中声明,如果数组未按升序排列,则结果未定义。问题是你正在用不同的比较器排序你的数组,比你通过binarySearch方法。所以你的结果是未定义的...在这种情况下没有找到。

传递比较器数组排序

Arrays.sort(arr, String.CASE_INSENSITIVE_ORDER); 

,并预期它会奏效。

+0

我认为使用核心API获得的数组是一个糟糕的主意。不仅仅是因为如果它是数据的副本,每次要使用时都必须使用它,而且因为如果不是副本,同一API的其他使用者将得到意外的结果(尽管其JavaDoc未声明关于排序的任何事情)(比如他们无法用区分大小写的binarySearch找到UTC)。 –

+0

你说得对。而当我再次阅读我的2cents时,它并没有真正回答这个问题,因为根本没有区分大小写的搜索。 – Alexander

1

在我机的时区ID的顺序是在为U以下:

java.util.TimeZone.getAvailableIDs.filter(_.startsWith("U")) 

RES0:数组[字符串] =阵列(UCT,US /阿拉斯加,US /阿留申,US /亚利桑那州,美国/中部,美国/东部印第安纳州,美国/东部,美国/夏威夷,美国/印第安纳州 - 斯塔克,美国/密歇根州,美国/山区,美国/太平洋地区,美国/通用)

正如你所看到的,UniversalUTC后,所以在不区分大小写的顺序,这个我s没有订购,在这种情况下不能使用binarySearch

我建议缓存一个SortedSetTreeSet)与这些ID不区分大小写的顺序,并用于搜索。

相关问题