在Java中搜索阵列和数组列表中的自定义对象



我写了一个具有显示方法和构造函数的员工类。

public class employee {
public int empid;
public String name;
public employee(int id, String name){
empid = id;
this.name = name;
}
public void display (){
System.out.println("Employee id: " +empid +"nEmployee name: "+name);
}
}
然后,我创建了三个员工的对象,并将它们存储在主类中的数组中。我创建了一个IF块,该块将检查用户猜测并打印员工详细信息,如果他的存在,或者如果不存在数据,则会引发异常。if块被封闭在循环的增强循环中。
public static void main(String[] args) {
    // TODO code application logic here

employee priya = new employee (001, "Priya");
employee tamizh = new employee (002, "Tamizh");
employee hari = new employee (003, "hari");
employee[] list = new employee[3];
list[0] = priya;  
list[1] = tamizh;
list[2] = hari;

int userGuess = 002;
for (employee l : list){
    if (userGuess == l.empid)
    {
    l.display();
    break;
    }
    else
    {
    throw new InputMismatchException ("employee doesnot exist");
    }
}
}   
}

问题是,即使猜测是正确的,该程序也会引发异常。我尝试了int变量empid,然后尝试了字符串变量名称,但是==和.equals都没有起作用。我搜索了stackoverflow,建议的解决方案是覆盖员工类中的哈希码并等于方法。我做到了。

public class employee {
public int empid;
public String name;
public employee(int id, String name){
empid = id;
this.name = name;
}
public void display (){
System.out.println("Employee id: " +empid +"nEmployee name: "+name);
}
    @Override
    public int hashCode(){
    final int prime = 31;
    int result = 1;
    result = prime * result + empid;
    result = prime * result + name.hashCode();
    return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        employee other = (employee) obj;
        if (this.empid != other.empid)
            return false;
        if (this.name.equals(other.name))
            return false;
        return true;
    }       
}

现在,当我将输入作为001提供时,代码正常工作。但是对于任何其他输入(包括现有的Empids 002和003),正在抛出例外。

我在覆盖中做错了什么?另外,我不理解我为覆盖这两种方法而编写的代码。有人可以解释逻辑以及我在哪里出错吗?谢谢。

编辑:谢谢大家。我已经意识到了for循环的错误,并且已经对其进行了编辑。它现在正常工作。

int userGuess = 002;
boolean found = false; 
for (employee l : list){
    if (userGuess == l.empid)
    {
    l.display();
    found = true;
    break;
    }
}
if(found == false){
    try{
    throw new InputMismatchException ("employee doesnot exist");
        }
    catch(InputMismatchException e){
     System.out.println("Employee doesnot exist.");
    }
}

非常感谢。有人可以解释我在等式和哈希码方法中所做的事情吗?我从答案中复制了代码,但找不到解释。再次感谢。

您从第一个条目开始通过整个数组进行迭代。因此,如果将第一个条目与用户输入进行比较(假设其002),则语句将是错误的。因此,它会抛出一个例外。

要解决此问题,您必须检查是否在迭代的数组中找到了条目。

int userGuess = 002;
boolean userFound = false;
for (employee l : list)
{
    if (userGuess == l.empid)
    {
       userFound = true;
       l.display();
       break;
    }
}
if(!userFound)
{
   throw new InputMismatchException ("employee doesnot exist");
}

回答您的第二个问题:

我认为您不需要Equals()和HashCode()方法。

等于检查两个对象是否相同(请参阅https://msdn.microsoft.com/de-de/library/bbsc2ak47(v=vs.110).aspx)

hashcode()方法为对象生成一个"唯一"值(请参阅https://msdn.microsoft.com/de-de/library/system.object.gethashcode.gethashcode(V=VS.110).aspx)

这应该对您有用:

boolean found = false;
for (employee l : list){
  if (userGuess == l.empid) {
      l.display();
       found = true;
        break;
    }
}
if(!found){
    throw new InputMismatchException ("employee doesnot exist");
}

您现有的代码将不起作用,因为循环中的第一个始终是001

最新更新