【问题标题】:Finding index value of an Object arrayList using indexOf() in Java在 Java 中使用 indexOf() 查找对象数组列表的索引值
【发布时间】:2014-05-10 20:37:59
【问题描述】:

该方法扫描当前员工Employee数组,看是否 任何员工与员工之间存在匹配 进来了。

如果没有匹配则返回 -1,并且 Employee 的索引号 如果有匹配。

现在我的问题是,我该如何使用 -

indexOf();

正确获取对象的索引值的方法,依次获取empId与传入的员工匹配的员工

public int findEmployee(Employee emp) {
    int index = -1;
    for (Employee s : staff) {
        if (emp.getEmpId() == s.getEmpId()) {
            index = indexOf(); //how to use this
        }
    }

    return index;
}

我愿意接受任何其他比较方式,因为我知道 indexOf() 可以为我搜索并找到 empId。因此,如果我必须完全取消 if 语句,我不介意。我认为它会使代码更有效。

【问题讨论】:

  • 您阅读过indexOf() 文档吗?
  • 您不能使用以员工 ID 作为键的哈希图吗?是否有多个条目具有相同的员工 ID?
  • 您知道在遍历人员并返回它时可以使用 int 变量作为索引吗?除此之外,同意user3580294
  • 我是 java 新手。我在 C++ 编程方面经验丰富。 @user3580294 - 是的,我有 n 这次我无法理解它。

标签: java arrays oop indexof compareobject


【解决方案1】:

从 cmets 开始,因为对 cme​​ts 的解释可能太长了 indexOf()。其他回答者提供了很好的选择,但我会按照要求的方式回答。

我假设您正在使用某种List(例如staffArrayList<Employee>),因为Arrays 实用程序类似乎没有indexOf() 方法。

不幸的是,我没有 C++ 经验,所以我不确定 Java 中的哪些概念可以很好地映射到 C++。如果您有任何问题,请随时提出。

ArrayList#indexOf(Object o) 的 javadoc 声明:

返回此列表中指定元素第一次出现的索引,如果此列表不包含该元素,则返回 -1。更正式地说,返回满足(o==null ? get(i)==null : o.equals(get(i))) 的最低索引 i,如果没有这样的索引,则返回 -1。

有趣的部分是这样的:

返回满足(o==null ? get(i)==null : o.equals(get(i)))的最低索引i

所以本质上,indexOf() 所做的就是遍历列表,直到找到这样的元素:

  • 如果o == null,则该元素也为空
  • 如果o != nullo.equals(element) 返回真

如果不存在这样的元素,则返回-1。我假设您传入的员工是非空的,我将重点关注那里的第二个选项。

o.equals(element) 是不言自明的。然而,有一些事情需要注意:如果Employee 类没有覆盖equals(),你可能不会得到你想要的行为。这是因为equals() 的默认实现会检查 reference 相等性 (您要比较的两个引用指向同一个底层对象,类似于我在 C++ 中猜测的两个指针指向到相同的位置/对象),而不是对象相等(“正常”相等,如果两个对象“代表相同的事物”,则它们相等,即使它们是不同的对象)。

因此,在您的情况下,如果您想通过 ID 号匹配员工,您需要编写一个接受对象的 equals() 方法,检查它是否是 Employee,如果它是,如果传递的对象的员工 ID 与您正在调用 equals() 的员工的 ID 匹配。当然,如果这样的equals() 方法已经存在,那么你就不用做任何事情了。如果equals() 已经被覆盖并且有一些不同的行为,那么你可能会不走运......

另外,请注意您使用的方法签名是equals(Object o),而不是 equals(Employee e)。这是两个不同的方法签名,只有第一个会覆盖Object#equals()

一旦您编写了正确的equals() 方法,indexOf() 应该会为您完成剩下的工作。

【讨论】:

  • 对不起,如果这似乎有点居高临下,我对 C++ 不是很熟悉,所以我不知道它们有什么共同点和不同之处。
  • 非常感谢! :) 你终于为我回答了。我需要的只是这个和解释。我已经有足够的编程经验来想出其他人提供的替代方案。我一直在寻找的是更具体的 Java,并利用一些 Java 特性来解决这个问题。
  • 以后有什么问题可以问吗?
  • @user3624184 没问题!很高兴我能帮上忙!当然,您可以随时提出问题。
  • @user3624184 请记住,在线 API 是您最好的朋友,尤其是对于内置 Java 库。如果你有 JDK,源代码也应该可用,所以这是另一个资源。
【解决方案2】:

如果每个Employee都有自己唯一的id,那么你需要在Employee对象内部实现equals()方法,如果id相等则返回true,例如:

@Override    
public boolean equals(Object object) {
    return (object instanceof Employee) && (id != null) 
         ? id.equals(((Employee) object).id) //change ".equals" to "=" if you use int instead of Integer, which I believe you apparently do.
         : (object == this);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    相关资源
    最近更新 更多