首页 > 解决方案 > 如何在foreach循环java中返回具有特定字段(函数?)最小值的对象

问题描述

我试图从 for-each 循环中获取对象“Employee”的最小值。

我创造了一些员工;

// 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 值,而是希望返回整个员工对象,以便我可以在其上调用一个单独的函数,例如:

员工(分配合同的价值最小).assignContract - 将新合同分配给当前分配合同数量最少的员工。所以基本上,我如何让 for-each 返回员工而不是分配合同的 int 值?

任何帮助将不胜感激。

问候,乙


当所有三个提交的答案都有效时,我该怎么办?!谢谢。此外,如果 2+ 具有相同的最小值,我怎么能随机返回一名员工,例如,2 名员工都分配了 0 份合同。

标签: javaalgorithmoopfor-loopforeach

解决方案


您可以使用一个简单的 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();

推荐阅读