2016-12-16 10 views
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<>(); 
  1. キーの並び替え、最大の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()); 
    
  • +2

    'List .getListOfStuff()'は何をするべきか明確にすることができますか?たとえば、 'list.stream()。filter(...)。count()'のように書き直すことができます。 'list'は' List 'の型ですか? –

    +1

    したがって、複雑なソート条件、まずキー、次に値属性(リストのサイズ、最大)でマップをソートしますか?元のマップが 'HashMap'であると仮定すると、キーは一意でなければなりません。彼らは決して平等ではないので、セカンダリソート条件を確認する必要はありません。 – AJNeufeld

    +0

    'Comparator.comparing(Map.Entry > :: getKey' =>' Entry :: comparisonByKey' – assylias

    答えて

    1

    HashMapのは、あなたの代わりにTreeMapを使用して、コンストラクタにあなたのコンパレータを渡すことができ、ソートのための理想的ではありませんコンパレータは、キーだけではない値のために働く

    関連する問題