2016-07-26 7 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" 出力が見つからない= --->
  • するsearchString = " america/los_angeles "---> 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

あなたは正しいです。そして、2セントをもう一度読んでも、大文字と小文字を区別しない検索が全く行われないので、実際にこの質問には答えません。 – Alexander

1

ゾーンIDがUために、次のされている時刻順:

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

RES0:配列[文字列] =配列(UCT、米国/アラスカ、アメリカ/アリューシャン、米国/米国/ミシガン、米国/マウンテン、米国/パシフィック、米国/パシフィック - ニュー、米国/サモア、UTC、米国/ユニバーサル)

あなたが見ることができるように、Universalは、UTC後であるので、大文字小文字を区別しないために、このIこの場合はbinarySearchを使用することはできません。

これらのIDの大文字小文字を区別しない順番でキャッシュSortedSetTreeSet)を指定し、検索に使用することをお勧めします。

関連する問題