Java 如何在ArrayList中查找属性值最大的对象(使用不同的类)
这里是Java初学者。我应该找到一个参与者在一个活动中的最佳结果(然后将这个结果与其他人进行比较,以找到获胜者等) 我为事件(包含事件结果列表)、参与者(包含参与者总结果列表)和结果(包含事件obj、参与者obj和结果(double))创建了类+一个用于命令的程序类 到目前为止,我已经编写了一个方法,将参与者在事件中的最佳结果作为double返回,但我需要返回整个result对象。不确定哪个类应该负责这个(?),但我现在把这个方法放在事件类中Java 如何在ArrayList中查找属性值最大的对象(使用不同的类),java,class,object,arraylist,max,Java,Class,Object,Arraylist,Max,这里是Java初学者。我应该找到一个参与者在一个活动中的最佳结果(然后将这个结果与其他人进行比较,以找到获胜者等) 我为事件(包含事件结果列表)、参与者(包含参与者总结果列表)和结果(包含事件obj、参与者obj和结果(double))创建了类+一个用于命令的程序类 到目前为止,我已经编写了一个方法,将参与者在事件中的最佳结果作为double返回,但我需要返回整个result对象。不确定哪个类应该负责这个(?),但我现在把这个方法放在事件类中 public double getBestResul
public double getBestResultDouble(Participant p) {
double best = 0;
if (hasResult(p)) {
for (Result r : eventResults) {
if (p.equals(r.getParticipant())) {
double res = r.getResult();
if (res > best) {
best = res;
}
}
}
}
return best;
}
提前谢谢你 只需将相应的(最佳)结果保存为另一个局部变量,并在末尾返回:
public Result getBestResultDouble(Participant p) {
double best = 0;
Result bestResult = null;
if (hasResult(p)) {
for (Result r : eventResults) {
if (p.equals(r.getParticipant())) {
double res = r.getResult();
if (res > best) {
best = res;
bestResult = r;
}
}
}
}
return bestResult;
}
只需将相应的(最佳)结果保存为另一个局部变量,并在末尾返回:
public Result getBestResultDouble(Participant p) {
double best = 0;
Result bestResult = null;
if (hasResult(p)) {
for (Result r : eventResults) {
if (p.equals(r.getParticipant())) {
double res = r.getResult();
if (res > best) {
best = res;
bestResult = r;
}
}
}
}
return bestResult;
}
试着从OOP(面向对象编程)的角度多考虑一些 一名
参与者
可以参与多个事件
。每次参与者
参与事件
,都会为该特定参与者生成一个结果
,并获得相应的分数
现在,我已经了解了如何布局类的基本结构,因此我们可以定义每个类的具体行为
public class Participant
{
private List<Event> events;
private String name;
public Participant( String name )
{
this.name = name;
events = new ArrayList<Event>();
}
//... other methods
public void participate( Event event )
{
double score;
//... get the score
events.add( event );
event.recordResult( this, score );
}
}
因此,现在您定义的每个事件
都有一种方法为特定参与者
的结果
打分
public class Event
{
private List<Result> results;
public Event()
{
results = new ArrayList<Result>();
}
// ...
public void scoreResult( Participant participant, double score )
{
//if a participant cannot participate multiple times in an event, probably need a check to see if
//the participant is already in the list, otherwise update the score isntead of adding a new Result
results.add( new Result( participant, score ) );
}
}
我只做结果
类的基本提纲
public class Result
{
private Participant participant;
private double score;
public Result( Participant participant, double score )
{
this.participant = participant;
this.score = score;
}
// ... getters and setters
}
这可能是对象的基本轮廓。现在,您可以在参与者
中定义一种方法,以获得他所参与的所有事件
中的最佳结果。比如:
public Result getBestResult()
{
Result bestResult = null;
for( Event event : events )
{
if( bestResult == null )
bestResult = event.getResult();
if( bestResult.getScore() < event.getResult().getScore() )
bestResult = event.getResult();
}
//if the participant hasn't participated in any event, then this will return a null result.
return bestResult;
}
public Result getBestResult()
{
结果bestResult=null;
对于(事件:事件)
{
if(bestResult==null)
bestResult=event.getResult();
if(bestResult.getScore()
我希望这是有意义的,并将帮助您以一种更为面向对象的方式思考问题。这样,您可以为事件
定义其他方法,例如如何获得具有最高结果的参与者
当然,这只是布局类的一种方法,我强烈建议您在编码之前尝试提前思考您希望对象如何相互交互。考虑对象之间的关系。我知道你只是一个初学者,所以这可能有点高级,但如果你认真学习如何高效地编写代码,这肯定是值得研究的。试着从面向对象编程(OOP)的角度多考虑一些
一名参与者
可以参与多个事件
。每次参与者
参与事件
,都会为该特定参与者生成一个结果
,并获得相应的分数
现在,我已经了解了如何布局类的基本结构,因此我们可以定义每个类的具体行为
public class Participant
{
private List<Event> events;
private String name;
public Participant( String name )
{
this.name = name;
events = new ArrayList<Event>();
}
//... other methods
public void participate( Event event )
{
double score;
//... get the score
events.add( event );
event.recordResult( this, score );
}
}
因此,现在您定义的每个事件
都有一种方法为特定参与者
的结果
打分
public class Event
{
private List<Result> results;
public Event()
{
results = new ArrayList<Result>();
}
// ...
public void scoreResult( Participant participant, double score )
{
//if a participant cannot participate multiple times in an event, probably need a check to see if
//the participant is already in the list, otherwise update the score isntead of adding a new Result
results.add( new Result( participant, score ) );
}
}
我只做结果
类的基本提纲
public class Result
{
private Participant participant;
private double score;
public Result( Participant participant, double score )
{
this.participant = participant;
this.score = score;
}
// ... getters and setters
}
这可能是对象的基本轮廓。现在,您可以在参与者
中定义一种方法,以获得他所参与的所有事件
中的最佳结果。比如:
public Result getBestResult()
{
Result bestResult = null;
for( Event event : events )
{
if( bestResult == null )
bestResult = event.getResult();
if( bestResult.getScore() < event.getResult().getScore() )
bestResult = event.getResult();
}
//if the participant hasn't participated in any event, then this will return a null result.
return bestResult;
}
public Result getBestResult()
{
结果bestResult=null;
对于(事件:事件)
{
if(bestResult==null)
bestResult=event.getResult();
if(bestResult.getScore()
我希望这是有意义的,并将帮助您以一种更为面向对象的方式思考问题。这样,您可以为事件
定义其他方法,例如如何获得具有最高结果的参与者
当然,这只是布局类的一种方法,我强烈建议您在编码之前尝试提前思考您希望对象如何相互交互。考虑对象之间的关系。我知道你只是一个初学者,所以这可能有点高级,但如果你认真学习如何高效地编写代码,这肯定是值得研究的。在Java中,最常见的方法是创建一个Comparator
的实例,它比较结果的实例。您将比较委托给比较器,而不是自己进行比较
然后可以使用标准Java方法进行排序
标准:
List<Result> = ....
Comparator<Result> cmp = ....;
list.sort(cmp);
Result max = list.get(0);
List=。。。。
比较器cmp=。。。。;
列表排序(cmp);
结果max=list.get(0);
溪流
List<Result> = ....
Comparator<Result> cmp = ....;
Result max = list.stream().max(cmp);
List=。。。。
比较器cmp=。。。。;
结果max=list.stream().max(cmp);
Double已经具有可比性,因此您可以对比较器进行如下编码:
Comparator<Result> cmp = new Comparator() {
public int compare(Result r1, Result r2)
{
return r1.getResult().compareTo(r2.getResult());
}
}
比较器cmp=新比较器(){
公共整数比较(结果r1,结果r2)
{
返回r1.getResult().compareTo(r2.getResult());
}
}
在Java中,最常见的方法是创建比较器的实例,该比较器比较结果的实例。您将比较委托给比较器,而不是自己进行比较
然后,您可以使用标准Java方法进行排序