基本上我希望它停止并打印一条消息,如果他们已经将该人添加到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.");
}
}
}
}
}
我已经习惯了很长一段时间,但是我无法理解为什么它不起作用。
答案 0 :(得分:1)
使用equals()方法比较字符串,而不是==
答案 1 :(得分:1)
您还应该在String.equals
方法中使用Student.equals
:
if (this.getName().equals(((Student) o).getName()) &&
this.getID().equals(((Student)o).getID()))
您的Student.equals
使用==
进行String
比较,比较对象引用,如果Strings
在字典上相等但不相同String
,则会失败对象
答案 2 :(得分: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也是一个字符串,也可以为它做这个..
答案 3 :(得分:0)
使用equals
比较名称和ID。在这种情况下,==
比较归结为一个对象comaration将导致false,因为两个名称(每个名称不同String
)是不同的对象。它不会进行文字比较。
以防万一,因为这是一个名称比较,您可能希望使用equalsIgnoreCase
,因为,例如,John Doe
实际上与john doe
的名称相同。如果ID是字母数字,则相同。