2011-12-05 5 views
0

2つの副問題があります。Javaのクラスメンバーの値に基づいて巨大な配列リスト(ArrayList <Class>)をソート

1-比較巨大な2つのArrayList(1)を達成するために、そのオブジェクトの値に基づいのArrayListの要素をソート

-2-。

私はクラスのオブジェクトのArrayListを持っています。すなわち

Class X 
{ 
    double x; 
    double y; 
    int sortVal; 
} 

ArrayList<X> alX = new ArrayList<X>(); //size = 10,000 
ArrayList<Integer> myValue = new ArrayList<Integer>(); //size = 15 

myValueがsortValに存在するかどうかをチェックしたいと思います。

arraylist 'alX'のサイズが大きいため、計算時間がかかります。

クラスXのsortValの値に基づいてArrayList alXのelemetsをソートする方が良い方法だと思っていました。ソートすることで、sortValがmyValueより大きくなるとループから壊れることがあります。

1) 'sortVal'という値に基づいてarraylistの要素をソートするにはどうすればよいですか?

2)arraylistをソートするよりも、2つの値を比較する方が良い方法がありますか?すなわち(myValues.get(I)== alX.ob.sortVal)

[編集]の値は、あなたの最初の質問については

ArrayList<X>: 
x  : 1,1,1,2,3,5,4,5 
y  : 2,4,6,4,4,6,2,1 
sortVal: 10,20,30,10,10,20,30 

ArrayList<Integer>: 
myValue: 10,20,30 

答えて

3

の場合はMap<Integer, X>を、そうでない場合はMap<Integer, Lists<X>>を作成することができます。これには時間の複雑さがO(n)か、O(n * log n)があり、これはソートのコストです。


EDIT:これは、キーのマルチマップとそのキーのオブジェクトのセットを1回のパスで作成します。

List<X> xs = ... 
Map<Integer, Set<X>> mapBySortVal = new LinkedHashMap<>(); 
for(X x: xs) { 
    Set<X> set = mapBySortVal.get(x.sortVal); 
    if (set == null) 
     mapBySortVal.put(x.sortVal, set = new LinkedHashSet<>()); 
    set.add(x); 
} 

for(Integer value: myValues) { 
    Set<X> xs = mapBySortVal.get(value); 
    if (xs != null) 
     // found some. 
} 
+0

sortValの値は一意ではありません。複雑さがO(n)ならば、arraylistsを一度だけトラバースするだけでどのように値を加算するのですか? 2人のarraylistsの値をマップに追加する方法についてもっと説明できますか? 値があるとします。 ArrayList : x:1,1,1,2,3,5,4,5; y:2,4,6,4,4,6,2,1; ; sortVal:10,20,30,10,10,20,30。 ArrayList : myValue:10,20,30; – SyncMaster

+0

@SyncMaster私の編集を参照してください。 ;) –

2

ことを検討し、あなたは何であなたをコレクションを並べ替えることができますあなたがsortValあなたのフィールドを命名するので、私はこのクラスのインスタンスは、その値に基づいて並べ替えることができ、あなたがそのためにComparableインターフェイスを実装することがありますよね(Collections#sortを参照)、それは使うべきComparatorを指定することでの

を考えることができますクラス。こうすれば、Collections#sortを指定せずにComparator

0

Googleグアバは非常に便利な機能を備えています。配列の順序については、com.google.common.collect.Ordering<T>を提供します。例えば

:デフォルトでは、自然な順序によって、その要素を順序付け 使用マップ:あなたの条件に応じて、

Ordering<String> byLengthOrdering = new Ordering<String>() { 
public int compare(String left, String right) { 
    return Ints.compare(left.length(), right.length()); 
} 
}; 
List<String> sorted = byLengthOrdering.reverse().sortedCopy(sourceList); 
0

は2つのアプローチがあります。しかし、より多くの記憶が必要です。

または

コンパレータを使用してソートします。より多くの時間がかかります。

説明のためにドキュメントをご覧ください。

関連する問題