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;
}
提前谢谢!
答案 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());
}
}