0

该方法扫描当前的员工Employee数组,看是否有任何员工与传入的Employee匹配。

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

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

指数();

方法正确获取对象的索引值,进而获取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 语句,我不介意。我认为这将使代码更有效。

4

2 回答 2

1

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

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

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

ArrayList#indexOf(Object o)的 javadoc指出:

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

有趣的部分是这样的:

返回最低索引 i 使得(o==null ? get(i)==null : o.equals(get(i)))

所以本质上,indexOf()要做的是循环列表,直到找到一个元素:

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

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

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

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

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

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

于 2014-05-10T21:04:40.493 回答
0

如果每个 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);
}
于 2014-05-10T20:47:03.517 回答