2015-05-11 3 views
-5

Я задал этот вопрос в интервью:ява коллекция сортировать на базах другой коллекции

Class Student{ 
    int rollno; 
    String name; 
    List<Mark> marks; 
} 

Class Mark{ 
    String subject; 
    int mark; 
} 

Как получить студент из коллекции студента, который обеспечил третье самые высокие оценки?

+0

Как вы определяете «третьи высшие оценки»? – aioobe

+1

Ну, вы можете реализовать систему циклов и счетчик, чтобы подсчитать количество учеников, тогда вам нужно будет их упорядочить по убыванию, чтобы получить их в правильном порядке, а затем выбрать третью высоту. –

+0

. Предположим, что мы вычисляем процент/средний отметки из списка знаков ... Но в этом случае мы скажем, что четыре ученика с процентом 80%, пять учеников с 70%, три ученика с 60%, два ученика с 50%. Теперь нам нужны все те студенты с третьим самым высоким процентом, что лучший способ узнать это? – prisha

ответ

0

Поскольку они находятся в коллекции можно также вызвать Collections.sort с помощью пользовательского компаратора, как так:

Collections.sort(studentList, new Comparator<Student>() { 
     @Override 
     public int compare(Student a, Student b) { 
      double mark_a = Collections.max(a.marks); 
      double mark_b = Collections.max(b.marks); 
      return Double.compare(mark_a, mark_b); 
     } 
    }); 

Тогда вы можете просто вернуть третий студент. (вам может потребоваться изменить метод расчета для mark_a и mark_b в зависимости от того, что означает «Наивысшие отметки» ... Возможно, они хотят получить среднее значение)

+0

Предположим, что мы вычисляем процентные/средние оценки из списка знаков ... Но в этом случае мы скажем, что четыре ученика с процентом 80%, пять студентов с 70%, три ученика с 60%, два ученика с 50% , Теперь нам нужны все те студенты с третьим самым высоким процентом, что лучший способ узнать это? – prisha

+0

Создайте метод, который выглядит примерно так: 'public double average (список ) {double avg = 0; for (Mark m: list) {avg + = m.mark;} return (avg/list.size()); } 'затем замените строки' double mark_a = Collections.max (a.marks); и double mark_b = Collections.max (b.marks); 'с' double mark_a = average (a.marks); и double mark_b = средний (b.marks); ' –