Как я могу получить все максимальные значения из списка?

У меня есть класс Employee, реализующий интерфейс Comparable.

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

Я могу получить один объект, используя

 Employee employee = Collections.max(employeeList);

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


person user1585111    schedule 18.08.2013    source источник
comment
Вы можете отсортировать и взять все элементы, которые сравниваются с 0, с самым большим.   -  person assylias    schedule 18.08.2013
comment
Кстати, у вас, вероятно, должен быть отдельный Comparator для зарплат. Обычно не имеет смысла называть зарплату сотрудников естественным заказом.   -  person chrylis -cautiouslyoptimistic-    schedule 18.08.2013


Ответы (3)


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

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(n) и требует одного прохода по списку.

person JB Nizet    schedule 18.08.2013

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

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

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

person Bohemian♦    schedule 18.08.2013
comment
Вы должны выполнять итерацию с конца списка, а не с начала. - person JB Nizet; 18.08.2013
comment
@JBNizet да, пропущено reverse(). Теперь лучше? - person Bohemian♦; 18.08.2013
comment
Правильно, но это требует много работы, чтобы найти максимальное количество элементов. Сначала отсортируйте (O (n log n), затем переверните (O (n)), затем выполните итерацию по первым элементам. Вы можете по крайней мере отсортировать в порядке убывания с самого начала: Collections.sort(Collections.reverseOrder()) - person JB Nizet; 18.08.2013

person    schedule
comment
@SamMarsh точно. docs.oracle.com/javase/6/docs/ API/java/lang/Comparable.html - person ihsan kocak; 18.08.2013
comment
@SamMarsh Это должно быть так. Есть случаи, когда это не так, и в этом случае порядок считается несовместимым с equals. См. документацию для Comparable, чтобы может случиться. - person chrylis -cautiouslyoptimistic-; 18.08.2013