2016-12-16 3 views
0

私は次のビジネス要件を持っています 私はオブジェクトに対してvalue1とvalue2のペアを持っています。値2に従ってソートされたデータ構造にvalue1とvalue2を保存する必要があります。アイテム数のインデックスと値を並べ替える最も良い方法は

私が行ったことは、配列の各要素が2つの要素のマップマップを含むようにハッシュマップの配列を作ることです。値1と値2。しかし、私は、ソートメカニズムで立ち往生しています、私は(値2)第二の値に応じて配列をソートする必要が

HashMap[] array = new HashMap[100](); 

for(int i = 0; i < array.length; i++){ 
    array [i].put("value1", value1); 
    array [i].put("value2", value2); 
} 

私はこのように私はこれを格納するための最良の方法であるかどうかわからないです最高のデータ構造を使用してそれに応じてソートする必要がありますが、value2に従って並べ替えるときvalue1を追跡するために必要な主なもの

答えて

2

私は値2

に応じ

@Thomasは何が必要なのソートマップであることを正しいかもしれソートするとき、それは値2に固執するようVALUE1を追跡する必要があります。その制限は、SortedMapは、マップのキーによって一意でなければならないソートのみです。同じvalue2の内容でマップに2つのものを入れることはできません。

代わりに、2つの値をカプセル化するオブジェクトを作成することもできます。それが私たちがオブジェクト指向言語でしばしばやることです。

private static class ValueWrapper { 
    private final String value1; 
    private final String value2; 
    public ValueWrapper(String value1, String value2) { 
     this.value1 = value1; 
     this.value2 = value2; 
    } 
} 

その後、あなたはこれらのコレクションを作成することができます

List<ValueWrapper> wrappers = new ArrayList<>(); 
wrappers.add(new ValueWrapper("1", "a")); 
wrappers.add(new ValueWrapper("2", "b")); 

あなたがそれらをソートしたい場合は、オブジェクト自体はComparableを実装するか、外部Comparatorを使用して、それを並べ替えることができますどちらか。だから、あなたがオブジェクトを変更できます。

private static class ValueWrapper implements Comparable<ValueWrapper> { 
    private final String value1; 
    private final String value2; 
    public ValueWrapper(String value1, String value2) { 
     this.value1 = value1; 
     this.value2 = value2; 
    } 
    public int compareTo(ValueWrapper other) { 
     // we are comparing the value2 fields here 
     return this.value2.compareTo(other.value2); 
    } 
} 

次に、あなたが行うことができます:

List<ValueWrapper> wrappers = new ArrayList<>(); 
wrappers.add(new ValueWrapper("1", "a")); 
wrappers.add(new ValueWrapper("2", "b")); 
// this sorts objects that implement Comparable 
Collections.sort(wrappers); 

を別の方法として、外部Comparatorクラスを提供することができます。

// this uses an anonymous Comparator class but you can define a class to do it 
Collections.sort(wrappers, new Comparator<ValueWrapper>() { 
    public int compare(ValueWrapper o1, ValueWrapper o2) { 
     return o1.value2.compareTo(o2.value2); 
    } 
}); 

あなたはその後、それぞれが異なる方法でValueWrapperを比較し、夫婦異なるComparatorクラスを定義することができます:あなたはさまざまな方法でリストを並べ替える場合に便利です。

+0

ありがとうございます。あなたは正しい私は同じvalue2の内容でマップに2つの事を入れなければならないかもしれない – user3631926

+0

私はカプセル化されたオブジェクトの値を既に持っています(value1は実際にクラスのプライベート属性です)。どのようにValueWrapperクラスなしで上記を使用できますか? – user3631926

+0

次に、value1属性を持つクラスをコレクションに入れ、クラスに 'Comparable'を実装させるか、クラスに対して' Comparator'を書き込みます。 @ user3631926の上のサンプルコードを参照してください。 – Gray

1

代わりにSortedMapの実装が必要なようですね、おそらくTreeMap

SortedMap<String, String> values = new TreeMap<String, String>(); 
values.put(value2, value1); // value2 is the "key", value1 is the "value" 
+0

感謝。ソートはどうですか? – user3631926

+0

'SortedMap'はキーによって自動的にソートされます。それはそれを使用する全体のポイントです。 – Thomas

+0

ありがとうございました...なぜ私は質問に-1をつけていますか?アイデアはありますか? – user3631926

0

Javaのドキュメントによると、このHashMapのは、それが順序を変更することができるソートので、もし、私はそれにデータを格納するクラスを使用することをお勧めします「それは時間をかけて一定のままであるためであることを保証するものではありません」

public class test { public type1 a; public type2 b; }

ので、あなたはのは、implementsComparatorヘルパークラスを実装してみましょう。この

Arrays.sort(array, new Comparator<test>() { 
    @Override 
    public int compare(test o1, test o2) { 
     if(o1.a>o2.a)return 1; 
     else if(o1.a==o2.a)return 0; 
     return -1; 
    } 
}); 
0

のようなデフォルトのJavaソートアルゴリズムを使用することができます。

public class MyComparator implements Comparator { 
    public int compare(HashMap[] a, HashMap b) { 
     String aVal = a.get("value2"); 
     String bVal = b.get("value2"); 
     if ((aVal == null) || (bVal == null)) { 
      return 0; 
     } 
     return aVal.compareTo(bVal); 
    } 
} 

とこのようにそれを使用します。

Arrays.sort(array, new MyComparator()); 
関連する問題