Java 如何在ArrayList中查找属性值最大的对象(使用不同的类)

Java 如何在ArrayList中查找属性值最大的对象(使用不同的类),java,class,object,arraylist,max,Java,Class,Object,Arraylist,Max,这里是Java初学者。我应该找到一个参与者在一个活动中的最佳结果(然后将这个结果与其他人进行比较,以找到获胜者等) 我为事件(包含事件结果列表)、参与者(包含参与者总结果列表)和结果(包含事件obj、参与者obj和结果(double))创建了类+一个用于命令的程序类 到目前为止,我已经编写了一个方法,将参与者在事件中的最佳结果作为double返回,但我需要返回整个result对象。不确定哪个类应该负责这个(?),但我现在把这个方法放在事件类中 public double getBestResul

这里是Java初学者。我应该找到一个参与者在一个活动中的最佳结果(然后将这个结果与其他人进行比较,以找到获胜者等)

我为事件(包含事件结果列表)、参与者(包含参与者总结果列表)和结果(包含事件obj、参与者obj和结果(double))创建了类+一个用于命令的程序类

到目前为止,我已经编写了一个方法,将参与者在事件中的最佳结果作为double返回,但我需要返回整个result对象。不确定哪个类应该负责这个(?),但我现在把这个方法放在事件类中

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方法进行排序