【问题标题】:How to find one element of the object in arraylist of objects? [duplicate]如何在对象数组列表中找到对象的一个​​元素? [复制]
【发布时间】:2020-07-09 23:34:20
【问题描述】:

我有一个 Employee 类对象的数组列表。 每个员工都有 id、fname、lname 等。 我需要获取员工 ID 为例如 1234521953 的元素的索引。如何找出员工所在的索引?每个 ID 都是独一无二的,这就是为什么我要通过 ID 找到他。

public class Employee extends Person {
    private String employerName;
    private LocalDate employmentDate;
    private LocalDate releaseDate;
    private BigDecimal salary;
    private String jobtitle;    
}

还有我班的人:

public class Person {
    public long getId() {
        return id;
    }

    private long id;
    private String fname;
    private String lname;
    private String addressLine;
    private LocalDate birthDate;
}

我将它们添加到:

List<Employee> employeesAL = new ArrayList<>();

【问题讨论】:

  • SH是Employee类的代码和listplee
  • 已编辑!添加了 Employee 类和我添加它们的数组列表
  • 好的,我已经编辑了我的答案;)

标签: java arraylist


【解决方案1】:

如果您在Employee 类中实现了.equals 方法,您可以将其传递给.indexOf()

List<Employee> l = new ArrayList<>();
Employee e = new Employee("ID123");
int idx = l.indexOf(e);

由于ID是唯一的,你不需要检查.equals()方法中的所有字段,只需检查ID

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Employee employee = (Employee) o;
    return id == employee.id;
}

或者自己实现,和indexOf一样的逻辑

int idx = -1;
for (int i = 0; i < l.size(); i++) {
    if (e.getId() == l.get(i).getId()) {
        idx = i;
        break;
    }
}

【讨论】:

  • @tadziuuuuu 我不知道,但作为建议:为您的代码发布一个最小的工作示例,例如这里所有的 getter 和 setter 都是无用的,只需要类结构(属性); )
  • 好的,从现在开始我的帖子会更好看:D
【解决方案2】:

你可以这样写:

public Employee getEmployee(String id) {
    for (Employee employee : employees) {
        if (employee.getId().equals(id)) {
            return employee;
        }
    }
    return null;
}

但是如果列表中有很多员工,它会很慢,因为它会遍历列表。如果您想通过 ID 快速查找员工,我建议您使用 Map(例如 HashMap),以 Employee 为键值。

另一种选择是确保列表中的Employee 对象按id 顺序保存。然后你可以对列表进行二分搜索以找到具有特定 id 的 Employee。

【讨论】:

    【解决方案3】:

    一种现代方式是使用流 API:

    public Optional<Employee> getEmployee(String id) {
        Optional<Employee> employee = employeesAL.stream()
              .filter(employee -> id.equals(employee.getId()))
              .findAny();
    
        return employee;
    }
    

    此方法返回 Optional&lt;Employee&gt;,因为您不能保证可以为您传入的每个 ID 找到员工。This page 有一个很好的使用 Optionals 的指南。

    【讨论】:

      【解决方案4】:

      用户@azro 和@elevate 的答案是正确的。但是,如果您使用的是 Java 8 及更高版本,则可以使用以下命令来查找元素:

      List<Employee> employeesAL = new ArrayList<>();
      ....
      public Employee findEmployee(long id) {
          Optional<Employee> optionalEmployee = employeesAl.stream()
                                               .filter(e -> e.getId() == id)
                                               .findFirst().orElse(null);
      }
      

      注意:请注意,从方法返回 null 是一个坏习惯。如果您知道如何使用 Optional 类,这是从可以为 null 的方法返回值的更好方法;因此您可以通知客户端该值可以为 null,它应该处理这种情况。

      【讨论】:

      • 列表应该是一个参数,而不是使用isPresent() 使用orElse 与您的代码return employeesAL.stream().filter(e -&gt; e.getId() == id).findFirst().orElse(null); 执行相同的操作
      • @azro 谢谢你是对的;我会编辑答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 2019-05-12
      • 2013-02-02
      • 1970-01-01
      • 2020-11-24
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多