【问题标题】:How to return object with smallest value of specific field (function?) in foreach loop java如何在foreach循环java中返回具有特定字段(函数?)最小值的对象
【发布时间】:2019-03-11 17:50:46
【问题描述】:

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

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

任何帮助将不胜感激。

问候, 乙


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

【问题讨论】:

    标签: java algorithm oop for-loop foreach


    【解决方案1】:

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

    【讨论】:

    • 接受,这是我采用的解决方案。如果两者都具有相同的最小分配合同值,我是否可以实现随机选择员工的逻辑..例如:都是 0?
    • 首先,谢谢。是的当然。您可以查找使用种子生成随机数。
    【解决方案2】:

    怎么样:

    Employee minEmployee = Arrays.stream(employees)
          .sorted(Comparator.comparing(Employee::getNumberOfCurrentlyAssignedContracts))
          .findFirst().get();
    

    【讨论】:

      【解决方案3】:

      你可以这样做

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

      然后用ref做任何你想做的事

      当然,改用ArrayList 会容易得多

      【讨论】:

        【解决方案4】:

        类似的东西应该可以解决问题。之后,您只需将合同分配给选定的人员即可。

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

        【讨论】:

          猜你喜欢
          • 2021-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-30
          • 2014-01-11
          • 1970-01-01
          • 2012-07-13
          • 1970-01-01
          相关资源
          最近更新 更多