在java中搜索数组和arraylists中的自定义对象

时间:2017-12-12 16:04:20

标签: java arrays method-overriding

我编写了一个员工类,它有一个显示方法和构造函数。

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);
}
}

然后我创建了三个employee对象并将它们存储在主类的数组中。我创建了一个if块,用于检查用户猜测并打印员工详细信息(如果存在),或者如果数据不存在则抛出异常。 if块被包含在一个增强的for循环中,循环遍历数组。

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,然后是String变量名,但是==和.equals都没有用。我搜索了stackoverflow,建议的解决方案是覆盖employee类中的hashcode和equals方法。我做到了。

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.");
    }
}

非常感谢你们。有人可以解释我在equals和hashcode方法中所做的事情吗?我从答案中复制了代码,但我无法找到解释。再次感谢。

2 个答案:

答案 0 :(得分:1)

从第一个条目开始迭代整个数组。 因此,如果您将第一个条目与您的用户输入(比如说它的002)进行比较,则该语句将为false。所以它会引发异常。

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

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()方法。

equals检查两个对象是否相同(参见https://msdn.microsoft.com/de-de/library/bsc2ak47(v=vs.110).aspx

hashCode()方法生成一个" unique"对象的值(参见https://msdn.microsoft.com/de-de/library/system.object.gethashcode(v=vs.110).aspx

答案 1 :(得分:0)

这应该适合你:

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