Как вернуть объект с наименьшим значением определенного поля (функции?) В цикле foreach Java - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь получить наименьшее значение для объекта «Сотрудник» из цикла for-each.

Я создаю несколько сотрудников;

// Create Employees
Employee Employee1 = new Employee(1, "Bradley", 0);
Employee Employee2 = new Employee(2, "Patrick", 0);
Employee Employee3 = new Employee(3, "Erin", 0);
Employee Employee4 = new Employee(4, "Jim", 0);
Employee Employee5 = new Employee(5, "Fredrick", 0);

Третий аргумент - количество назначенных контрактов, которое по умолчанию равно 0.Затем мой код назначает некоторые контракты, а количество назначенных контрактов увеличивается и т. Д. Затем я создаю массив из вышеперечисленных сотрудников следующим образом:

Employee[] employees = new Employee[] {Employee1, Employee2, Employee3, Employee4, Employee5};

Я могу распечатать сумму контрактов, назначенных каждому сотруднику, используяпетля ниже;

for (Employee employee : employees) {
    System.out.println(employee.numberOfCurrentlyAssignedContracts);
}

Я пытаюсь вернуть сотрудника с наименьшим числом employee.numberOfCurrentlyAssignedContracts, но вместо того, чтобы возвращать его значение int, я хочу, чтобы весь объект employee был возвращен, чтобы я мог вызвать отдельныйфункция на нем, например:

сотрудник (с наименьшим значением назначенных контрактов) .assignContract - назначение нового контракта сотруднику с наименьшим количеством назначенных в настоящее время контрактов.Итак, в основном, как мне заставить каждого вернуть сотрудника, а не значение int назначенных контрактов?

Любая помощь будет принята с благодарностью.

С уважением, B


Что мне делать, когда все три представленных ответа работают ?!Спасибо.Кроме того, как я могу вернуть сотрудника случайным образом, если 2+ имеют одинаковое минимальное значение, например, 2 сотрудника и 0 назначенных контрактов ..

Ответы [ 4 ]

3 голосов
/ 11 марта 2019

Вы можете использовать простой цикл for, чтобы найти сотрудника с минимальным количеством контрактов, как показано ниже:

int minContract = Integer.MAX_VALUE;
Employee empMin = null;
for (Employee employee : employees) {
    if (employee.getNumberOfCurrentlyAssignedContracts() < minContract) {
        // swap min and employee if true
        empMin = employee;
        minContract = empMin.getNumberOfCurrentlyAssignedContracts();
    }
}

Теперь у вас есть ссылка на объект сотрудника с минимальными контрактами:

System.out.println(empMin);

Если вы используете java-8, вы можете просто сделать:

Employee empMin = Arrays.stream(employees)
                        .min((e1, e2) -> 
                                  e1.getNumberOfCurrentlyAssignedContracts() - 
                                  e2.getNumberOfCurrentlyAssignedContracts())
                        .get();
1 голос
/ 11 марта 2019

Вы могли бы сделать что-то вроде этого

Employee ref = employees[0];
int min = ref.numberOfCurrentlyAssignedContracts;
for (Employee employee : employees) {
    if(min>employee.numberOfCurrentlyAssignedContracts){
         min = employee.numberOfCurrentlyAssignedContracts;
         ref = employee;
    }
}

Тогда делай, что хочешь, с ref

Конечно, было бы намного проще использовать ArrayList вместо

1 голос
/ 11 марта 2019

Как насчет:

Employee minEmployee = Arrays.stream(employees)
      .sorted(Comparator.comparing(Employee::getNumberOfCurrentlyAssignedContracts))
      .findFirst().get();
0 голосов
/ 11 марта 2019

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

public static void main(String[] args) {
Employee employee1 = new Employee(1, "Bradley", 10);
Employee employee2 = new Employee(2, "Patrick", 70);
Employee employee3 = new Employee(3, "Erin", 50);
Employee employee4 = new Employee(4, "Jim", 4);
Employee employee5 = new Employee(5, "Fredrick", 8);

Employee[] employees = new Employee[] {employee1, employee2, employee3, employee4, employee5};
int employeeWithLeastContractsID = employees[0].getID();
int employeesWithLeastContractsTotal = employees[0].getContracts();;
for (Employee employee : employees) {
if(employee.getContracts() < employeesWithLeastContractsTotal){
    employeeWithLeastContractsID = employee.getID();
    employeesWithLeastContractsTotal = employee.getContracts();
}
}
System.out.println("Employee ID: "+employeeWithLeastContractsID + "\nEmployee contracts: "+employeesWithLeastContractsTotal);
}
...