4
私はマップがあり、複数の条件に基づいてキーをソートする必要があります。どのようにJava 8のコンパレータとストリームを使用してこれを達成するには?Javaでマップと値のプロパティで複数のコンパレータを使用する方法8
class MyObject {
private Set<Objects> setOfStuff;
public Set<Objects> getSetOfStuff(){
return listOfStuff;
}
public int countStuff(){
return listOfStuff.size();
}
}
Map<String, List<MyObject> needsSorting = new HashMap<>();
needsSorting.put("Monday", createSetOfObj());
needsSorting.put("Wednesday", createSetOfObj());
needsSorting.put("Thursday", createSetOfObj());
Set<MyObject> createSetOfObj() {
...
return list;
}
Map<String, Set<MyObject>> sortedResult = new LinkedHashMap<>();
- キーの並び替え、最大の
MyObject countStuff();
ない場合の大きさに基づいてList<MyObject>
アップデート1:
私は1 & 2を行っていると思います。これは私が必要との比較を生産しているようだ
:3
Comparator<Entry<String, List<MyObject>>> comparator = Comparator.comparing(Map.Entry<String, List<MyObject>>::getKey)
.thenComparingInt(e -> e.getValue().size());
アップデート2を行う方法についてだけでわかりません。簡単なサイズのアクセスのためにcountStuffを追加しました。
SortedMap<String, List<MyObject>> sorted = new TreeMap<>(comparator);
編集:
Comparator<Entry<String, Set<MyObject>>> comparator = Comparator.comparing(Map.Entry<String, Set<MyObject>>::getKey)
.thenComparingInt(e -> e.getValue().size())
.thenComparingInt(e -> e.getValue().stream().map(MyObject::countStuff).max(Integer::max).get());
'List .getListOfStuff()'は何をするべきか明確にすることができますか?たとえば、 'list.stream()。filter(...)。count()'のように書き直すことができます。 'list'は' List 'の型ですか? –
したがって、複雑なソート条件、まずキー、次に値属性(リストのサイズ、最大)でマップをソートしますか?元のマップが 'HashMap'であると仮定すると、キーは一意でなければなりません。彼らは決して平等ではないので、セカンダリソート条件を確認する必要はありません。 – AJNeufeld
'Comparator.comparing(Map.Entry> :: getKey' =>' Entry :: comparisonByKey' –
assylias