2013-08-18 4 views
3

У меня есть класс под названием Employee, который реализует интерфейс Comparable.Как получить все максимальные значения из списка?

Сейчас у меня есть 5 Employee объектов в моем списке, каждый из которых имеет свою собственную собственность salary. Я хочу найти все объекты Employee, у которых максимальная зарплата.

я могу получить один объект с помощью

Employee employee = Collections.max(employeeList); 

но возвращает только один Employee, в то время как я пытаюсь получить массив или список всех объектов с одинаковым максимальным значением. Как я могу это сделать?

+8

Вы можете отсортировать и принять все предметы, которые сравниваются с 0 с наибольшим. – assylias

+1

Кстати, у вас, вероятно, должен быть отдельный «компаратор» для зарплаты. Обычно не имеет смысла называть зарплату сотрудников естественным порядком. – chrylis

ответ

6

Чтобы быть эффективной, вы должны перебрать список и найти все максимальные элементы от себя:

List<Employee> result = new ArrayList<>(); 
Employee currentMax = null; 
for (Employee e : list) { 
    if (currentMax == null || e.compareTo(currentMax) > 0) { 
     currentMax = e; 
     result.clear(); 
     result.add(e); 
    } 
    else if (currentMax!= null && e.compareTo(currentMax) == 0) { 
     result.add(e); 
    } 
} 

Это решение O (п), и требует один проход по списку.

-1
Employee max=Collections.max(employeeList); 
List <Employee> maxEmployeeList=new ArrayList<Employee>(); 
maxEmployeeList.add(max); 
for(Employee e:employeeList){ 
    if(e.equals(max)){ 
    maxEmployeeList.add(e); 
    } 
} 
+0

'equals' ->' compareTo == 0'? –

+0

@SamMarsh точно. http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html –

+0

@SamMarsh Это * должно быть так. Бывают случаи, когда это не так, и в этом случае заказ считается «несовместимым с« равно ». См. [Документы для 'Comparable'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html), чтобы узнать, что может случиться. – chrylis

0

Попробуйте это:

Collections.sort(list); 
Collections.reverse(list); 
Set<Employee> highest = new HashSet<Employee>(); 
Employee max = list.get(0); 
for (Employee employee : list) { 
    if (e.compareTo(max) < 0) break; 
    highest.add(employee); 
} 

Я выбрал набор, потому что не должно быть никаких дубликатов.

+1

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

+0

@JBNizet yep - влево 'reverse()'. Теперь лучше? – Bohemian

+0

Правильно, но это делает очень много работы, чтобы найти максимальные элементы. Первая сортировка (O (n log n), затем обратная (O (n)), а затем итерация по первым элементам. Вы можете, по крайней мере, отсортировать в порядке убывания с самого начала: 'Collections.sort (Collections.reverseOrder())' –