在链表java中查找元素

在链表java中查找元素,java,linked-list,Java,Linked List,我有一个完整的员工链表要测试,我想迭代一下,看看是否找到了一个员工,然后返回true,这确实有点作用,但是它只会找到列表中的最后一个员工,我做错了什么?此外,我有不同类型的员工,例如从account类继承的经理,如果这让人困惑,很抱歉!对不起,还是初学者!!谢谢 以下是我添加的帐户列表: LinkedList<Account> Accounts = new LinkedList<Account>(); Employee John = new Account("John

我有一个完整的员工链表要测试,我想迭代一下,看看是否找到了一个员工,然后返回true,这确实有点作用,但是它只会找到列表中的最后一个员工,我做错了什么?此外,我有不同类型的员工,例如从account类继承的经理,如果这让人困惑,很抱歉!对不起,还是初学者!!谢谢

以下是我添加的帐户列表:

LinkedList<Account> Accounts = new LinkedList<Account>(); 

Employee John = new Account("John", "password1");
Manager Bob = new Account("Bob", "password2");   
编辑:下面是我添加的代码,但它只适用于最后一个用户。如果在链表中找到帐户名,我希望该方法返回true,以便系统可以继续并请求进一步的信息等。name变量位于我的帐户类中

private boolean check(String employee){
     for(Account a : accounts){
        if(a.name.equals(employee)){
            return true;
        }
     }
     return false;
 }
不需要迭代,我会为你做的

if (e.getEmployee().equals(employee))
如果对象相同,这将进行比较,这意味着它们在内存中是相同的

当查看一个或多个属性时,您需要指定对象的哪些属性必须相等,以便从逻辑上说两个不同的对象是相同的

比如说

John.equals(Bob) 
将永远不会为true,但如果对象John和对象Bob都具有name属性a String=“Alex”,则


将为真

无需重复列表。 因此,您可以将检查方法替换为

  private boolean check(String employee) {
           return Accounts.contains(employee);
}
你应该进一步替换

 Employee John = new Accounts("John", "password1");
 Manager Bob = new Accounts("Bob", "password2");


你有两个选择。第一种方法是将支票方法的签名更改为使用
帐户
对象,或者从帐户对象中提取一个字段进行比较:

private boolean check(Account account){
      return accounts.contains(account);
}
但是,这需要您为
帐户
实现一个自定义
equals()
方法:

@Override
public boolean equals(Object obj){
    if(obj instanceof Account){
         Account acct = (Account)obj;
         //Compare any internal fields that mean it's "equal"
         if(acct.prop1 == this.prop1 && ...) {
            return true;
          }
    }

    return false;
}
您的另一个选择是仅与迭代中的特定字段进行比较:

private boolean check(String emp){
     for(Account a : accounts){
        if(a.stringProperty.equals(emp)){
            return true;
        }
     }
     return false;
 }

听起来你的遍历逻辑有问题。您应该发布相应的代码getEmployee()返回什么?如果不是字符串,则需要编写一个Equals方法Account类是否具有Equals()方法?如果没有,Java将使用默认值,它只检查两个对象是否是相同的实例,并且不会匹配具有相同数据的两个实例。有关更多详细信息,请参阅。@MarkoŽivanovićHi no my Account类没有equals方法,我现在将尝试实现此方法。使用Java 8可以缩短发布的代码,以
return Accounts.stream().anyMatch(employee::equals)(顺便说一句,对变量名使用camelCase-
accounts
,而不是
accounts
)。这只有在Account类正确实现了equals()时才有效(
@Override
)。@JNY
equals()
在这种情况下无法“正确”实现,因为任何
equals()
Accounts
类上的
方法在传递
String
时返回
true
将违反equals契约,特别是关于它的部分是自反的。因此,我的Account类中是否需要一个equals()?@DavidConrad很好,你完全正确。这不适用于字符串比较。@aluckii否,因为contains()依赖于列表的基础类的equals()方法,如JavaDocsNo中所示,您不能,因为任何
帐户
对象都不能是
字符串
。因此我需要一个新方法来实现这一点,很抱歉,我该如何开始呢?那么它是否类似于equals(employee){if(employee==account)return true?,只是变量namesop的一个例子,应该确保他正在比较“苹果对苹果”因为当前显示的是将Employee对象与String对象进行比较。@JNYRanger啊,好吧,那么我应该将它们与实际帐户进行比较?而不是字符串?您需要将一个对象的属性与另一个对象的属性进行比较,以便从逻辑上推断它们是否相等。直接比较两个对象只会比较它们的属性Java不知道在使用equals()时如何定义对象和属性字段因此,您必须更深入地选择要在两个对象之间进行比较的特定字段。您需要提供自己的比较方法,并使其成为对象的一部分,这样您就可以轻松调用类似于
Bob.customCompare(John);
hi谢谢,如果我要创建自己的equals()方法我只需更改check方法-return accounts.contains(account);return accounts.equals(account);同样在第二个解决方案中,我可以用该帐户的用户名替换“stringProperty”吗?谢谢为了让第一个方法起作用,您需要在account类中实现一个equals方法,否则它只会检查集合中是否存在完全相同的对象。当然,我只是使用了一个通用名称作为示例请确保您正在比较相同的类型。谢谢:),我会试试这个
private boolean check(Account account){
      return accounts.contains(account);
}
@Override
public boolean equals(Object obj){
    if(obj instanceof Account){
         Account acct = (Account)obj;
         //Compare any internal fields that mean it's "equal"
         if(acct.prop1 == this.prop1 && ...) {
            return true;
          }
    }

    return false;
}
private boolean check(String emp){
     for(Account a : accounts){
        if(a.stringProperty.equals(emp)){
            return true;
        }
     }
     return false;
 }