【问题标题】:searching custom objects in arrays and arraylists in java在java中的数组和arraylists中搜索自定义对象
【发布时间】:2017-12-12 16:04:20
【问题描述】:

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

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 块包含在一个增强的 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,建议的解决方案是覆盖员工类中的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 时,代码可以正常工作。但是对于任何其他输入(包括现有的 empid 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 方法中所做的事情吗?我从答案中复制了代码,但找不到解释。再次感谢。

【问题讨论】:

  • 数组中的第一个是001,所以它当然不等于002。不确定你要做什么。你这里没有使用 equals 方法。
  • 您在循环中抛出异常,但您没有捕获它。所以它没有第二次循环。
  • @puterBoy 如果您用我的回答解释问题,我可以尝试纠正它。谢谢,
  • @isaace 我尝试了您的代码,但程序仍然退出 if 块并在第一次迭代后抛出异常。需要在 for 循环之外获取异常以使代码正常工作。
  • 它在我的回答中的 for 循环之外。我看不出它是如何在第一次迭代后退出的..

标签: java arrays overriding


【解决方案1】:

您从第一个条目开始遍历整个数组。 因此,如果您将第一个条目与您的用户输入(假设它的 002)进行比较,则该语句将是错误的。所以会抛出异常。

要解决此问题,您必须检查是否在 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() 方法为对象生成一个“唯一”值(参见https://msdn.microsoft.com/de-de/library/system.object.gethashcode(v=vs.110).aspx

【讨论】:

    【解决方案2】:

    这应该适合你:

    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

    【讨论】:

    • 这不会告诉哪个员工不存在。
    • @Truthira OP 正在讨论手动输入。请仔细阅读问题。
    • 来自 OP “我创建了一个 if 块,它将检查用户的猜测并打印员工的详细信息,如果他存在,或者如果数据不存在,则会抛出异常。”我认为 op 早些时候接受了你的,顺便说一句我不会对你投反对票:)
    • @Truthira 我不认为你投了反对票。看起来OP正在硬编码一个ID。如果 OP 在这里发表评论,我会知道他们为什么不接受它。
    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 2014-04-13
    • 2011-05-06
    • 2013-03-22
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多