私は値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
クラスを定義することができます:あなたはさまざまな方法でリストを並べ替える場合に便利です。
ありがとうございます。あなたは正しい私は同じvalue2の内容でマップに2つの事を入れなければならないかもしれない – user3631926
私はカプセル化されたオブジェクトの値を既に持っています(value1は実際にクラスのプライベート属性です)。どのようにValueWrapperクラスなしで上記を使用できますか? – user3631926
次に、value1属性を持つクラスをコレクションに入れ、クラスに 'Comparable'を実装させるか、クラスに対して' Comparator'を書き込みます。 @ user3631926の上のサンプルコードを参照してください。 – Gray