0

メソッドのパーツの上のコメントで、私がやろうとしていることを説明します。

public int addPatron(String name) throws PatronException {
    int i = 0;
    //1. Iterate through a hashmap, and confirm the new name I am trying to add to the     record doesn't already exist in the hashmap
    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
        Patron nameTest = entry.getValue();
        //2. If the name I am trying to add already exists, we want to throw an exception saying as much.
        if (nameTest.getName() == name) {
            throw new PatronException ("This patron already exists");
            //3. If the name is unique, we want to get the largest key value (customer number) already in the hash, an increment by one.
        } else if (nameTest.getName() != name) {
            Map.Entry<Integer,Patron> maxEntry = null;
            for(Map.Entry<Integer, Patron> entryCheck : patrons.entrySet()) {
                if (maxEntry == null || entryCheck.getKey() > maxEntry.getKey()) {
                    maxEntry = entryCheck;
                    i = maxEntry.getKey();
                    i++;
                }
            }

        } else {
            throw new PatronException("Something's not working!");
        }
        //4. If everything is ok up to this point, we want to us the name and the new customer id number, and use those to create a new Patron object, which then gets added to a hashmap for this class which contains all the patrons.
        Patron newPatron = new Patron(name, i);
        patrons.put(i, newPatron);
    }
    return i;
}

addPatron に同じ名前を連続して 2 回追加すると失敗する単純な単体テストを実行しようとすると、テストが失敗します。

try {
    testLibrary.addPatron("Dude");
    testLibrary.addPatron("Dude");
    fail("This shouldn't have worked");

テストは失敗し、addPatron メソッドは同じ名前を 2 回使用できることがわかります。

@ジョンスキート:

私の Patron クラスは次のようになります。

public class Patron {

//attributes
private String name = null;
private int cardNumber = 0;

//operations
public Patron (String name, int cardNumber){
    this.name = name;
    this.cardNumber = cardNumber;
}

public String getName(){
    return name;

}

public int getCardNumber(){
    return cardNumber;
}

}

4

4 に答える 4

2

他の人が言っているように、==文字列を比較するための使用はほぼ間違いなく不適切です。ただし、同じ定数文字列を2回使用しているため、テストケースで実際に問題が発生することはないはずなので、機能する==はずです。もちろん、使用するコードを修正する必要がありますequals

Patronまた、コンストラクターまたはgetNameメソッドが何をするのかも明確ではありません-どちらも問題を引き起こす可能性があります(たとえば、文字列の新しいコピーを作成する場合-テストが失敗する原因になりますが、通常は不要です)。

私にとってもう少し心配なのは、このコメントです。

// 3. If the name is unique, we want to get the largest key value (customer number) 
// already in the hash, an increment by one.

このコメントはメインループ内にあります。したがって、その時点では、名前が一意であるかどうかはわかりません。この反復での利用者の名前と一致しないことだけがわかります。

さらに心配なことに、これに気付いたばかりですが、反復ブロック内でも追加を実行します。あなたはもっとこのようなものを持っているべきだと私には思えます:

public int addPatron(String name) throws PatronException {
    int maxKey = -1;

    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
        if (entry.getValue().getName().equals(name)) {
            // TODO: Consider using IllegalArgumentException
            throw new PatronException("This patron already exists");
        }
        maxKey = Math.max(maxKey, entry.getKey());
    }
    int newKey = maxKey + 1;
    Patron newPatron = new Patron(name, newKey);
    patrons.put(newKey, newPatron);
    return newKey;
}

さらに、名前から利用者へのマップ、場合によってはIDから利用者へのマップが本当に必要なようです。

于 2012-12-15T21:53:44.357 に答える
0

使用してみてください

nameTest.getName().equals(name)

それ以外の

nameTest.getName() == name

文字列の値ではなく、参照を比較しているためです。 ここで説明します

コードをもう一度確認しました

さて、私はあなたのコードをもう一度調べました、そして問題はあなたのHashMapがテストの開始時に空であるということです。したがって、ループが実行されることはありません==>パトロンが追加されたり、例外がスローされたりすることはありません。

于 2012-12-15T21:52:36.153 に答える
0

Java で String オブジェクトを比較するには、== ではなく equals を使用する必要があります。したがって、次のように置き換えます。

if (nameTest.getName() == name) {

と:

if (nameTest.getName().equals(name)) {
于 2012-12-15T21:49:54.613 に答える
-1

問題の原因は、比較演算子の使用方法にあります==

この演算子を 2 つのオブジェクトに対して使用する場合、変数が同じ参照を指していることをテストします。

2 つのオブジェクトの値が等しいかどうかをテストするには、使用可能な場合はequals()メソッドまたはを使用する必要compareToがあります。

String クラスの場合、同じ文字がさらにequals格納されていることを確認するには、の呼び出しで十分です。

equals メソッドとは

オブジェクトの値を比較するには 問題は、名前をどのように比較するかです。

于 2012-12-15T21:50:12.007 に答える