2011-09-13 22 views

回答

6

它沒有任何意義,除去基於價值鍵值對

我不認爲你足夠的想象力。我承認可能沒有使用寬的,但是會有有效的情況。

作爲示例用例,假設您有一個Map<Person, TelephoneNumber>,名爲contactList。現在您想要通過本地聯繫人列表篩選聯繫人列表。

要完成此操作,您可以複製地圖localContacts = new HashMap<>(contactList)並刪除TelephoneNumber以區域代碼以外的區域代碼開始的所有映射。這將是一個有效的時間,你想通過values集合迭代,並刪除一些值:

Map<Person, TelephoneNumber> contactList = getContactList(); 
Map<Person, TelephoneNumber> localContacts = new HashMap<Person, TelephoneNumber>(contactList); 

for (Iterator<TelephoneNumber> valuesIt = localContacts.values().iterator(); valuesIt.hasNext();){ 
    TelephoneNumber number = valuesIt.next(); 
    if (!number.getAreaCode().equals(myAreaCode)) { 
     valuesIt.remove(); 
    } 
} 

尤其是當有重複的值,呼籲解除對上述集合會導致意想不到的鍵感除去。

如果您想刪除全部與該值的映射怎麼辦?

0

返回的Collection是一個特殊的Collection,它的語義是這樣的,它知道它的值與它來自的Map的關係。 javadoc表示返回的集合支持什麼樣的Collection操作。

+2

這個問題似乎是關於爲什麼它被允許,而不是它是如何做的。 – Kevin

+0

@凱文 - 好點。我似乎錯過了這個細微差別:)我會在這裏留下這個答案,因爲有人在這個問題上發現它可能會發現它的相關性。 – cdeszaq

6

它必須有一個remove方法,因爲這是Collection的一部分。鑑於此,它可以選擇允許您刪除值或拋出一個UnsupportedOperationException。由於您可能想刪除值的合法理由,爲什麼不選擇允許此操作?

  • 也許有你想要從Map刪除它的每一個實例 給定值。
  • 也許你想修剪出每個第三個 鍵/值對出於某種原因。
  • 也許你從酒店 房號佔據計數的地圖,你想在佔據計數大於一,以 發現有人住在一個​​房間裏,從 清除一切地圖。
  • ...如果你想更 密切,有很多更喜歡這樣的例子...

簡而言之:有很多的情況下,這可能是有用的,實現它不會傷害任何人誰不使用它,爲什麼不呢?

0

我認爲通常有一種用於刪除基於密鑰的值;其他答案顯示的例子。鑑於此,如果你想刪除某個值,爲什麼你只想要刪除它的一個特定的鍵?即使你做了,你也必須知道你想刪除哪個密鑰(或者不是,視情況而定),然後你應該通過密鑰將其移除。

相關問題