迭代通过hashmap - 抛出异常

时间:2012-12-16 02:12:17

标签: java hashmap

这与我之前提到的问题有关: Iterating through hashmap and creating unique objects - trying to prevent duplicates

虽然我假设我可以为我的add方法应用类似的逻辑,但我必须检查不存在的记录的异常即使我知道记录存在并且应该很好被删除。我的删除方法如下:

    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;
}

 }

我的测试只是先添加三个顾客,然后尝试用我知道存在的卡号删除它。我在我的添加方法中添加了一个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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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所示

答案 2 :(得分: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");

}

因此,如果第一个条目与您的参数不匹配,则抛出异常。这就是为什么你要抛出自定义异常的原因。逻辑是有缺陷的。

第二次看,它可能比这更复杂,因为你没有提供添加条目的代码。但这是我的第一次猜测......

编辑:

在我看来,您还想检查该值是否存在以及是否确实将其删除。您无需循环来实现此目的。

查看HashMap API中的containsKeycontainsValue方法。然后,您只需调用remove方法。

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

答案 3 :(得分:0)

如果 if 语句( for 循环内)将不会匹配一条记录的EXCEPT。必须将 if 语句移到 for 循环之外。

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

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