2017-02-05 7 views
-2

elementと一致するelemが必要です。
私のプログラムは動作しますが、効率的ではありません。私は非常に大きいArrayList<Obj> pairs(4000以上の要素)を持っており、私は一致するインデックスを見つけるためにバイナリ検索を使います。ペアのリストのバイナリ検索

ループを使用してArrayListペアの半分を新しいArrayListリストにコピーするより効率的な方法があるのだろうかと思います。 OBJのための コンストラクタ:Obj x = new Obj(String elem, String word);

+1

はい - より効率的な方法は、あなたのペアは、検索() –

+1

使用中のコールひとつひとつの時間をあなたのリストのコピーを作成し、自分自身をリストしていないため、バイナリ検索を書くことです*その他* ['binarySearch()'](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#binarySearch-java.util.List-T-java.util。 Comparator-)メソッドを使用し、リスト要素を直接比較するための[Comparator'](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html)を提供します。 – Andreas

答えて

0

問題が解決したようです。 ArrayListのペアの型がObjで、elementの型がStringだったため、Collections.binarySearchを使用できませんでした。新しい変数 Obj x = new Obj(element, "");を作成することにしました。私のcompareToメソッドが2つのelemを比較し、Obj xの第2の変数を無視するので、文字列が問題を引き起こさない(JUnitテストに合格した)ようです。

私の更新方法:

public int search(String element) { 
    Obj x = new Obj(element, ""); 
    int index = Collections.binarySearch(pairs, x); 
0

あなたのマスターリスト(pairs)が、その後変更されない場合は、私は、例えばindex構造、逆維持するためにTreeMapを作成お勧めします:要素を検索しながら、

List<String> pairs = new ArrayList<String>(); //list containing 4000 entries 

Map<String, Integer> indexMap = new TreeMap<>(); 

int index = 0; 
for(String element : pairs){ 
    indexMap.put(element, index++); 
} 

今を、すべてを行う必要がある:

要素が電子しない場合は、あなたに必要な indexまたは nullを与える
indexMap.get(element); 

xist。また、要素がリストに複数回存在する場合は、indexMapMap<String, List<Integer>>に変更することができます。

あなたの現在のアルゴリズムが繰り返さリストとバイナリ検索を呼び出し、それははるかに高速になりますので、複雑さが反復してO(log n)TreeMapに対し保証log(n)時間コストのためにO(n)だろう。

HereのドキュメントTreeMapです。