0

基本上,如果他们已经将该人添加到 ArrayList 中,我希望它停止并打印一条消息,但它不会那样做。

这是方法:

@Override
    public boolean equals(Object o) {
        if (this.name == ((Student)o).getName() && this.ID == ((Student)o).getID()) {
            return true;
        }
        else {
            return false;
        }
    }

以及它用于的代码部分:

public void addStudents() {
        Scanner keyboard = new Scanner(System.in);
        String name = "", ID = "";

        System.out.println("Welcome! Please type exit at any point to stop entering students and for the lottery to commence.\n");

        System.out.print("Student name: ");
        name = keyboard.nextLine();

        if (!name.equals("exit")) {
            System.out.print("Student ID: ");
            ID = keyboard.nextLine();
        }

        while (!name.equals("exit") && !ID.equals("exit")) {
            System.out.print("\nStudent name: ");
            name = keyboard.nextLine();

            if (!name.equals("exit")) {
                System.out.print("Student ID: ");
                ID = keyboard.nextLine();

                if (!ID.equals("exit")) {
                    boolean contains = false;

                    for (int i = 0; i < students.size(); i++) {
                        if (students.get(i).equals((new Student(name, ID)))) {
                            contains = true;
                        }
                    }

                    if (!contains) {
                        students.add(new Student(name, ID));
                    }
                    else {
                        System.out.println("You can only enter once.");
                    }
                }
            }
        }
    }

我已经为此苦苦挣扎了一段时间,但无法弄清楚为什么它不起作用。

4

4 回答 4

1

使用 equals() 方法比较字符串,而不是 ==

于 2012-10-06T19:54:01.510 回答
1

您还应该String.equals在您的Student.equals方法中使用:

if (this.getName().equals(((Student) o).getName()) && 
    this.getID().equals(((Student)o).getID())) 

Student.equals用于比较==String比较对象引用,如果它们Strings在字典上相等但不是同一个String对象,则会失败。

于 2012-10-06T19:54:03.273 回答
0

你的方法有问题equals。。

public boolean equals(Object o) {
    if (this.name == ((Student)o).getName() && this.ID == ((Student)o).getID()) {
            return true;
    }
    else {
           return false;
    }
}

你也应该比较一下这个中的name使用equals()方法..

this.name.equals(((Student)o).getName())

如果您的 ID 也是一个字符串,请也为它执行此操作..

于 2012-10-06T19:54:05.960 回答
0

用于equals比较名称和 ID。在这种情况下,==比较归结为将导致错误的对象比较,因为两个名称(每个名称都不同String)是不同的对象。它不会进行字面比较。

以防万一,因为它是您可能想要使用的名称比较equalsIgnoreCase,例如,John Doe本质上与john doe. 如果 ID 是字母数字,则同样适用。

于 2012-10-06T19:54:09.857 回答