したがって、1つのクラスと1つのEnumがあります。Enumは、例えば:
public enum E {
E1, E2, E3
}
クラス:
public class A {
private E e;
private String name;
public A (E e, String name){
this.e = e;
this.name = name;
}
public E getE(){
return E;
}
public String getName(){
return name;
}
}
リスト<A>です。私が欲しいのは、名前と列挙型属性に応じてリストを(ストリームで)フィルタリングすることです。フィルターされるのは、同じ列挙型属性を持つ他のオブジェクトと比較して、名前の長さが最大でないAのみです。
出力はMap <E、List <A >>である必要があります。同じ名前の長さのオブジェクトが複数存在する可能性があるため、リストしてください。
サンプル:
List<A> input = Arrays.asList(new A(E.E1, "abcd"), new A(E.E1, "xyz"), new A(E.E2, "abcd"), new A(E.E2, "wxyz"), new A(E.E3, "xyzb"));
これは返されるはずです:
E1 = "abcd" // because "xyz" has length 3
E2 = "abcd", "wxyz" // as both have length 4, e.g. max length
E3 = "xyzb" // because it is the only object
私の解決策の1つは、「groupingBy」を使用してリストをそれぞれの列挙型グループにグループ化できることです。最後に、たとえば、Aのリストを値として持つ3つのキーがあります。最終的には、名前の最大長より短い名前を持つすべての値を削除する必要があります。しかし、それぞれのキーでのみ
あなたは、ネストされたを使用して起動することができますgroupingBy
属性によってグループ化されたことを確認するE
ことにより、さらにlength
のname
。でグループ化している間、名前の長さのエントリのみに関心name
があるため、にまとめることができTreeMap
ますmax
。これは、EをlastEntry
TreeMapの値にさらにマッピングできるようにするためです。
上記のアプローチによるソリューションは次のようになります。
Map<E, List<A>> output = input.stream()
.collect(Collectors.groupingBy(A::getE,
Collectors.groupingBy(e -> e.getName().length(),
TreeMap::new, Collectors.toList()))) // Map<E, TreeMap<Integer, List<A>>> // the nested groupings
.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
m -> m.getValue().lastEntry().getValue())); // only max length entry mapped here
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加