此方法扫描当前员工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 < / em>对我来说。因此,如果我必须取消 if语句,我不介意。我认为它会使代码更有效。
答案 0 :(得分:1)
来自评论,因为对indexOf()
的解释可能对评论来说太长。其他回答者提供了很好的选择,但我会回答所要求的方式。
我假设您正在处理某种List
(例如staff
是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 != null
,o.equals(element)
返回true 或者,如果不存在此类元素,则将返回-1
。我假设你传入的员工是非空的,我会专注于那里的第二个选项。
o.equals(element)
非常明显。但是,有一点需要注意:如果Employee
类没有覆盖equals()
,您可能无法获得所需的行为。这是因为equals()
的默认实现检查引用相等(其中您要比较的两个引用指向相同的底层对象,类似于我在C ++中猜测的是两个指向同一位置/对象的指针,而不是对象相等(“正常”等于,如果它们“代表相同的东西”,则两个对象相等,即使它们是不同的对象)。 / p>
所以看起来在你的情况下,如果你想按ID号匹配Employees,你需要编写一个接收Object的equals()
方法,检查它是否是{{1}如果是,则传递的对象的员工ID与您正在调用Employee
的员工的ID相匹配。当然,如果已经存在这样的equals()
方法,那么您不必做任何事情。如果equals()
已经被覆盖并且有一些不同的行为,那么你可能会运气不好......
另外,请注意您使用的方法签名是equals()
,而不是 equals(Object o)
。这是两种不同的方法签名,只有第一种方法会覆盖equals(Employee e)
。
一旦您编写了正确的Object#equals()
方法,equals()
就应该为您完成剩余的工作。
答案 1 :(得分: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);
}