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

时间:2017-02-01 19:50:28

标签: java class object arraylist max

Java初学者。我应该找到一个参与者在一个事件中得到的最好结果(后来将这个结果与其他人比较以找到胜利者等)。

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

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

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;
    } 

提前谢谢!

3 个答案:

答案 0 :(得分:3)

只需将相应的(最佳)结果保存为另一个局部变量,并在结尾处返回:

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;
}

答案 1 :(得分:1)

尝试在OOP(面向对象编程)方面多考虑一下。

Participant可以参加多个Event。每当Participant参与Event时,就会为该特定Result生成Participant并获得相应的分数。

现在我已经掌握了如何布置类的基本结构,因此我们可以定义每个类的具体行为。

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 );
    }
}

现在,Participant可以参与您定义的某些Event

现在看一下我在参与方法中所做的工作,我们需要一种方法来存储Result内的Event

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 ) ); 
   }
}

现在,您定义的每个Event都可以为特定Result评分Participant

我将只为Result

做基本大纲
public class Result
{

   private Participant participant;
   private double score;

   public Result( Participant participant, double score )
   {
      this.participant = participant;
      this.score = score;
   }


   // ... getters and setters
}

这可能是您的对象的基本大纲。现在,您可以在Participant中定义一个方法,以获得他参与的所有Result中最好的Event。例如:

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;
}

我希望这是有道理的,并且会帮助你以更多的方式思考问题。这样,您就可以为Event定义其他方法,例如如何获得Participant最高的Result

当然这只是布局类的一种方法,我强烈建议您在编码之前提前考虑您希望对象如何相互交互。考虑对象之间的关系。我知道你只是一个初学者,所以这可能有点先进,但如果你认真学习如何高效编码,这绝对值得研究。

答案 2 :(得分:0)

在Java中,最常见的方法是创建Comparator<Result>的实例,该实例比较Result的实例。您将比较委托给比较器,而不是比较自己。

然后,您可以使用标准Java方法进行排序。

标准

  List<Result> = ....
  Comparator<Result> cmp = ....;
  list.sort(cmp);
  Result max = list.get(0);

使用Streams

  List<Result> = ....
  Comparator<Result> cmp = ....;
  Result max = list.stream().max(cmp);

Double已经是可比较的,因此您可以将比较器编码为:

Comparator<Result> cmp = new Comparator() {
    public int compare(Result r1, Result r2)
    {
        return r1.getResult().compareTo(r2.getResult());
    }      
}