0

这与我之前问过的一个问题有关: 遍历 hashmap 并创建唯一对象 - 试图防止重复

虽然我假设我可以为我的 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;
}

 }

我的测试只是先添加三个顾客,然后尝试通过我知道会存在的卡号将其删除。我在我的 add 方法中添加了赞助人号码的 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");

    }

考虑 Map 中有 3 条记录 [0,1,2] 并且您传递libraryCardNumber为 1。您的条件仅第一次失败。注意 hashmap 不保证顺序,以顺序举例只是为了更好地理解

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 是否确实将其删除。你不必循环来实现这一点。

看看HashMap API 中的containsKeycontainsValue方法。然后您可以简单地调用该remove方法。

此外,在阅读评论后,您应该评估if (**entry.getKey()** != libraryCardNumber)这比依赖可变值对象字段要干净得多。

于 2012-12-16T02:21:37.657 回答
0

if语句(在for循环内)将不会匹配,除非有一条记录。该if语句必须移出for循环。

if块之后的语句也必须离开 for 循环。您不希望对 MAP 的每个成员都执行该操作,而只对地图的一个成员执行该操作。

试试 java.util.Map 的 containsKey 函数。

于 2012-12-16T02:24:00.777 回答