我正在尝试从包含的arraylist中返回一个对象 不同的对手为我的基于文本的格斗游戏。对手中的对手 arraylist有不同的“致命等级”,分开一个简单的对手 一个艰难的。
以不同方式解释;假设我的arraylist中有三个对手,他们分别有30,40和50的致命等级。我想回来 他们中最致命的,那就是那个有50级致命等级的对手。
我已经给了他们不同的致命等级,但我不确定如何 返回具有最高致命等级的对手。
答案 0 :(得分:6)
如果你想要最高级别,那就是max()。但是你想要最高级别的对手。在Eclipse Collections中,我们将该模式称为maxBy()
。如果您可以将ArrayList
替换为MutableList
,则会变为:
MutableList<Opponent> opponents = ...;
Opponent opponent = opponents.maxBy(Opponent::getDeadlyLevel);
如果您不能或不会转换ArrayList
,您仍然可以在Iterate
上使用静态工具。
Opponent opponent = Iterate.maxBy(opponents, Opponent::getDeadlyLevel);
您可以使用Collections.max()
和Comparator.comparing()
来构建Comparator
。
Opponent opponent =
Collections.max(opponents, Comparator.comparing(Opponent::getDeadlyLevel));
或者您可以使用Java 8 Streams。
Optional<Opponent> optionalOpponent =
opponents.stream().max(Comparator.comparing(Opponent::getDeadlyLevel));
Opponent opponent = optionalOpponent.get(); // If you're sure there's at least one
注意:我是Eclipse Collections的提交者。
答案 1 :(得分:4)
创建一个Comparator
,用于比较对手的等级并使用Collections.max(oponentList , theComparator)
。
答案 2 :(得分:3)
使用Stream#max()
为相关属性提供函数:
List<Fighter> list; // given a list of Fighters
Fighter deadliest = list.stream()
.max((a,b) -> a.getDeadlyLevel() - b.getDeadlyLevel())
.get();
答案 3 :(得分:1)
使用Comparator.comparing
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class DeathMatch {
public static void main(String[] arg){
List<Opponent> list = Arrays.asList(new Opponent("ZZ",10),new Opponent("WW",50),new Opponent("MM", 30));
Opponent deadliest = list.stream().max(Comparator.comparing(p->p.getLevel())).get();
System.out.println(deadliest.getName()+","+ deadliest.getLevel());
}
}