MWB:
私は悪役の束を持っていると言います。彼らは、彼らはどのように良い、悪いか、醜いことを特徴とします。
static class Villain {
String name;
int good;
int bad;
int ugly;
Villain(String name, int good, int bad, int ugly) {
this.name = name;
this.good = good;
this.bad = bad;
this.ugly = ugly;
}
}
さて、ギャングを満たしています。
List<Villain> villains = new ArrayList<>();
villains.add(new Villain("Bob", 2, 2, 1));
villains.add(new Villain("Charley", 2, 1, 2));
villains.add(new Villain("Dave", 2, 1, 1));
villains.add(new Villain("Andy", 2, 2, 2));
villains.add(new Villain("Eddy", 1, 2, 2));
villains.add(new Villain("Franz", 1, 2, 1));
villains.add(new Villain("Guy", 1, 1, 2));
villains.add(new Villain("Harry", 1, 1, 1));
私は何をしたい、私は最高のが誰であるかを把握したい、最悪と醜いです。そのことを私は最高のが誰であるかを把握することを意味します。同点の場合は、最悪の人です。同点の場合は、最も醜い人です。
私は以下のコードで、そうすることに成功しました。
List<Villain> bestVillains = villains
.stream()
.collect(groupingBy(v -> v.good, TreeMap::new, toList()))
.lastEntry()
.getValue()
.stream()
.collect(groupingBy(v -> v.bad, TreeMap::new, toList()))
.lastEntry()
.getValue()
.stream()
.collect(groupingBy(v -> v.ugly, TreeMap::new, toList()))
.lastEntry()
.getValue();
これは、確かに、につながるList<Villain>
アンディ:唯一のメンバーと。彼は本当に、最高の最悪かつ最も醜いです!
しかし、私は、任意の提案どのようにTEクリーンアップこの上など、再びストリームにそれらを回して、値を収集し、コードの繰り返しのかなりのビットを持っていますか?
これはどのようにJVMによって処理されています。順次またはフードの下で起こっていくつかの魔法はありますか?
また:
アイデアは(それはまだ決定的ではない場合)「醜いの最高値を有し、その後、悪いの最高値を有している(タイの場合は)良いの最高値となることはまずルックス、そして、ということですので、 "
あなたはむしろ、次を使用してソートを探しているComparator
ためVillian
秒:
Comparator<Villain> villainComparator = Comparator.comparingInt(Villain::getGood)
.thenComparingInt(Villain::getBad)
.thenComparingInt(Villain::getUgly);
Villain result = villains.stream()
.max(villainComparator)
.orElse(null);