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使用==します。辞書式に等しいが、同じオブジェクトではない場合は失敗します。StringStringsString

于 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 を比較するために使用します。この場合、両方の名前 (それぞれが異なる) が異なるオブジェクトであるため、==比較は結果が false になるオブジェクトの比較に要約されます。String文字通りの比較は行いません。

念のため、これは名前の比較であるequalsIgnoreCaseため、たとえばJohn Doeは本質的に と同じ名前であるため、使用したい場合がありjohn doeます。ID が英数字の場合も同様です。

于 2012-10-06T19:54:09.857 に答える