2016-07-26 113 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不區分大小寫的順序,並用於搜索。