【问题标题】:Can't find an object in ArrayList在 ArrayList 中找不到对象
【发布时间】:2017-05-26 05:38:05
【问题描述】:

我正在尝试使用对象的名称在另一个类中的数组列表中查找一个对象。

private void listParticipant() {
    System.out.print("Put in name of participant to see if currently registered: ");
    String name = readString(); 

    for (Team team : teamList) {
        if (team.hasParticipantWithName(name)) {
            System.out.println("Participant is registered.");
            return;
        }
    }

    System.out.println("Participant does not exist.");
}

但即使我知道列表包含我输入的名称,它也会返回“参与者不存在”。

这是我用来查找名称的团队类中的方法:

public boolean hasParticipantWithName(String name) {
    for (Participant part : participantList) {
        if (name.equals(part.getFullName())) {
            return true;
        }
    }
    return false;
}

这是我在另一个类中的getFullName 方法,其中包含参与者的构造函数。

public String getFullName(){
    String capitalizedLastName = lastName.substring(0, 1).toUpperCase()+lastName.substring(1);
    String capitalizedFirstName = firstName.substring(0, 1).toUpperCase()+firstName.substring(1);
    return (capitalizedFirstName + " " +  capitalizedLastName);
}

使用构造函数添加对象

public Participant(String firstName, String lastName, int id)

然后输入例如“john smith”和“John Smith”

我的读取字符串是

    private String readString() {
    return keyboard.nextLine().toLowerCase();
}

我不知道如何解决它。我试过用小写和大写的第一个字符来调用名称,但该方法在所有内容上都返回“不存在”。有任何想法吗? :)

【问题讨论】:

  • 仅凭给定的代码很难说出来(尽管我猜Object#equals 没有被覆盖)。您可能希望包含一个 MCVE,以便我们能够重现该行为并能够做出回应。
  • 请给一个输入示例..
  • 你能提供一个搜索名字的例子吗?还有readString 方法
  • 显然需要minimal reproducible example 或至少需要名称和团队值
  • 我会鼓励你学会自己调试。如果 A 不等于 B 但您确信它们相等,那么为什么不在比较之前打印出 A 和 B 的值呢?也许他们不是你期望的那样?

标签: java arrays list class object


【解决方案1】:

您正在使用此行从您的扫描仪读取:

return keyboard.nextLine().toLowerCase();

全名来自

public String getFullName(){
    String capitalizedLastName = lastName.substring(0, 1).toUpperCase()+lastName.substring(1);
    String capitalizedFirstName = firstName.substring(0, 1).toUpperCase()+firstName.substring(1);
    return (capitalizedFirstName + " " +  capitalizedLastName);
}

一方面您输入小写,另一方面您强制全名在第一个字符中使用大写。这永远不会相等。

你可以

  • getFullName() 结果上调用String.toLowerCase(),因为输入已经是小写,两者都将匹配,
  • 使用String.equalsIgnoreCase(String) 忽略两个值的大小写

注意:最后一个更安全,因为你不需要为自己设置一个特定的大小写(小写或大写),它会在方法中完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 2018-09-18
    • 2021-08-09
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多