2012-12-16 61 views
0

这涉及到一个问题,我刚才问: Iterating through hashmap and creating unique objects - trying to prevent duplicates通过HashMap的迭代 - 抛出异常

虽然我认为我可以申请一个类似的逻辑,我的删除方法,我有我的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; 
} 

仅供参考,顾客对象是这样的:

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

你想才达到什么?你的逻辑是什么? –

+0

我有一张可以添加到的赞助人名单的地图,如下所示:Map.Entry entry:patrons.entrySet()。我想通过提供一个数字来删除记录,然后这个数字将与Patron对象中的卡号相对应,该对象由字符串名称和int cardNumber构成。当顾客被创建时,int卡号与hashmap中赞助人的密钥相同。 – Benny

+1

什么是例外? – Thihara

回答

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显示

+0

与此一起工作,因为它最符合我需要完成的项目。我做了一些小的改动,我将这些改为原来的问题。 – Benny

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)这比您依赖可变值对象字段要干净得多。

0

如果声明(在循环内)将不会匹配,除了一条记录。 如果声明必须被移到以外的循环中。

如果块之后的语句也必须离开for循环。您不希望针对MAP的每个成员都完成该操作,只是地图的一个成员。

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

1

你得到的异常,因为下面的代码

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

    } 

考虑的有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; 
}