2012-12-16 97 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; 
}