0

これは、私が以前に尋ねた質問に関連してい ます。ハッシュマップを反復処理し、一意のオブジェクトを作成します-重複を防止しようとします

また、addメソッドと同様のロジックをremoveメソッドに適用できると想定していましたが、レコードが存在することをよく知っていて削除する必要がある場合でも、存在しないレコードをチェックする必要があるという例外がスローされます。私の削除方法は次のとおりです。

    public boolean removePatron(int libraryCardNumber) throws PatronException {
    boolean patronRemoved = false;
    int keyToRemove = 0;
    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
        if (entry.getValue().getCardNumber() != libraryCardNumber) {
            throw new PatronException("This record does not exist");

        }
        keyToRemove = entry.getKey();
    }
    patrons.remove(keyToRemove);
    patronRemoved = true;
    return patronRemoved;
}

参考までに、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;
}

 }

私のテストでは、最初に3人の常連客を追加し、次に、存在することがわかっているカード番号でそれを削除しようとします。addメソッドでPatronの番号のprintlnを追加したので、追加されたときにEclipseでこれをいじりながら簡単に確認できました。

    @Test
public void testRemovePatron() {
    boolean exceptionThrown = false;
    try {
        testLibrary.addPatron("TestName");
        testLibrary.addPatron("TestName2");
        testLibrary.addPatron("TestName3");
        testLibrary.removePatron(1);
    } catch (PatronException e) {
        System.out.println(e.getMessage());
        exceptionThrown = true;
        fail("what the hell is going on");
    }
    assertFalse(exceptionThrown);
}

毎回スローされるremoveメソッドから例外が発生します。

編集:一致するものが見つからなかった場合に例外をスローする必要があることを考慮して、提供された回答に小さな変更を加えました。

    public boolean removePatron(int libraryCardNumber) throws PatronException {
    boolean patronRemoved = false;
    int keyToRemove = 0;
    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) 
    {
        if (entry.getValue().getCardNumber() == libraryCardNumber) 
        {
            keyToRemove = entry.getKey();
            patronRemoved = true;
        }
    }
    if (patronRemoved)
    {
        patrons.remove(keyToRemove);
    } else {
        throw new PatronException("This record did not exist");
    }
    return patronRemoved;
}
4

4 に答える 4

1

次のコードが原因で例外が発生します

 if (entry.getValue().getCardNumber() != libraryCardNumber) {
        throw new PatronException("This record does not exist");

    }

マップに3つのレコード[0,1,2]がありlibraryCardNumber、1として合格したとします。条件は初めて失敗します。ハッシュマップは順序を保証するものではなく、理解を深めるために順序の例が取られていることに注意してください

public boolean removeDuplicateCardNumber(int libraryCardNumber) {
    for (Iterator<Map.Entry<Integer, Patron>> i = myMap.entrySet()
            .iterator(); i.hasNext();) {
        Map.Entry<Integer, Patron> entry = i.next();
        if (entry.getValue().getCardNumber() == libraryCardNumber) {
            i.remove();
            return true;
        }
    }
    return false;
}
于 2012-12-16T02:31:43.403 に答える
1

例外は、探しているユーザーではないユーザーに対してスローされます。これを変える:

public boolean removePatron(int libraryCardNumber) throws PatronException{
    boolean patronRemoved = false;
    int keyToRemove = 0;
    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
        if (entry.getValue().getCardNumber() != libraryCardNumber) {
            throw new PatronException("This record does not exist");

        }
        keyToRemove = entry.getKey();
    }
    patrons.remove(keyToRemove);
    patronRemoved = true;
    return patronRemoved;
}

これに:

public boolean removePatron(int libraryCardNumber) {
    boolean patronRemoved = false;
    int keyToRemove = 0;
    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) 
    {
        if (entry.getValue().getCardNumber() == libraryCardNumber) 
        {
            keyToRemove = entry.getKey();
            found = true;
        }
    }
    if (found)
    {
        patrons.remove(keyToRemove);
    }
    return patronRemoved;
}

AmitDが示したように、より簡潔に

于 2012-12-16T02:45:10.640 に答える
0
 for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
        if (entry.getValue().getCardNumber() != libraryCardNumber) {
            throw new PatronException("This record does not exist");

        }
        keyToRemove = entry.getKey();
    }

もっている

if (entry.getValue().getCardNumber() != libraryCardNumber) {
        throw new PatronException("This record does not exist");

}

したがって、最初のエントリがパラメータと一致しない場合、例外がスローされます。これが、カスタム例外がスローされる理由です。ロジックに欠陥があります。

もう一度見てみると、エントリを追加するコードを少し提供していないため、これよりも少し複雑になる可能性があります。しかし、これは私の最初の推測です...

編集:

また、値が存在するかどうか、およびtiが値を削除するかどうかを確認したいようです。これを達成するためにループする必要はありません。

HashMapAPIのメソッドcontainsKeyとメソッドを見てください。次に、メソッドcontainsValueを呼び出すだけです。remove

また、コメントを読んだ後、これを評価する必要がありますif (**entry.getKey()** != libraryCardNumber)。これは、可変値オブジェクトフィールドに依存するよりもはるかにクリーンです。

于 2012-12-16T02:21:37.657 に答える
0

そのifステートメント(forループ内)は、1つのレコードを除いて一致しません。そのifステートメントはforループを超えて移動する必要があります。

ifブロックの後のステートメントもforループを離れる必要があります。マップのすべてのメンバーに対してそのアクションが実行されることは望ましくありません。マップの1つのメンバーだけに対して実行されます。

java.util.MapのcontainsKey関数を試してください。

于 2012-12-16T02:24:00.777 に答える