2017-02-01 8 views
0

Java beginner here. Я должен найти лучший результат, который участник имеет в событии (и позже сравнить этот результат с другими, чтобы найти победителя и т. Д.).Как найти объект с наибольшим значением атрибута в ArrayList (используя разные классы)

Я сделал классы для события (со списком результатов мероприятия), участника (со списком итоговых результатов участника) и результата (с событием obj, obj участника и результатом (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

Изменить метод подписи к 'Result' вместо двойной, а затем вернуть побеждающий объект. Чтобы сохранить этот объект, вы можете создать экземпляр объекта в вашем методе. –

+0

Java 8: 'return Collections.max (eventResults, Comparator.comparingDouble (Результат: getResult));' – 4castle

+0

4castle Вы могли бы написать это как ответ, если бы вы были готовы предоставить объяснение. –

ответ

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

Try думать немного больше с точки зрения объектно-ориентированного программирования (объектно-ориентированное программирование).

A 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.

Конечно, это всего лишь один способ разметки классов, и я настоятельно рекомендую вам заранее подумать, как вы хотите, чтобы ваши объекты взаимодействовали друг с другом перед кодированием. Подумайте об отношениях между объектами.Я знаю, что вы всего лишь новичок, поэтому это может быть немного продвинутым, но если вы серьезно относитесь к тому, как научиться правильно кодировать, это определенно нужно изучить.

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 как:

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

 Смежные вопросы

  • Нет связанных вопросов^_^