爲什麼java.util.Map.values()
允許您從返回的集合中刪除條目,因爲根據值刪除鍵值對是沒有意義的?這樣做的代碼將不知道被移除的值(以及關鍵字)是從哪個關鍵字映射而來的。尤其是當存在重複值時,調用該集合上的remove會導致意外的鍵被刪除。爲什麼java.util.Map.values()允許您從返回的集合中刪除條目
3
A
回答
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
操作。
6
它必須有一個remove
方法,因爲這是Collection
的一部分。鑑於此,它可以選擇允許您刪除值或拋出一個UnsupportedOperationException
。由於您可能想刪除值的合法理由,爲什麼不選擇允許此操作?
- 也許有你想要從
Map
刪除它的每一個實例 給定值。 - 也許你想修剪出每個第三個 鍵/值對出於某種原因。
- 也許你從酒店 房號佔據計數的地圖,你想在佔據計數大於一,以 發現有人住在一個房間裏,從 清除一切地圖。
- ...如果你想更 密切,有很多更喜歡這樣的例子...
簡而言之:有很多的情況下,這可能是有用的,實現它不會傷害任何人誰不使用它,爲什麼不呢?
0
我認爲通常有一種用於刪除基於密鑰的值;其他答案顯示的例子。鑑於此,如果你想刪除某個值,爲什麼你只想要刪除它的一個特定的鍵?即使你做了,你也必須知道你想刪除哪個密鑰(或者不是,視情況而定),然後你應該通過密鑰將其移除。
相關問題
- 1. 爲什麼「不允許從函數返回結果集」?
- 2. 爲什麼它不允許我從TFS中刪除文件?
- 3. 從集合中刪除項目的建議方法是什麼?
- 4. 爲什麼Python的queue.Queue.get()允許從超時提前返回?
- 5. 爲什麼mysql給出錯誤「不允許從函數返回結果集」?
- 6. 爲什麼查詢返回空集合?
- 7. 爲什麼sameElements對集合返回true?
- 8. 爲什麼條目不被刪除?
- 9. 什麼類型的可變對象集合將允許我快速刪除Python中的項目?
- 10. 過濾Redis哈希條目 - 從哈希或從集合中刪除條目
- 11. this.model.toJSON()沒有返回集合的項目,爲什麼?
- 12. 刪除方法不允許,並返回Laravel 5中的MethodNotAllowedHttpException
- 13. EF 4.1:從集合中刪除子對象不會刪除它 - 爲什麼?
- 14. EF 4:從集合中刪除子對象不會刪除它 - 爲什麼?
- 15. MongoDB:從子集合中刪除項目
- 16. 休眠 - 從集合中刪除項目
- 17. Backbone.js:從集合中刪除項目
- 18. 從對象集合中刪除項目
- 19. 爲什麼有條件的屬性方法不允許返回非空
- 20. htmlpurifier爲什麼會刪除允許的IMG標記?
- 21. 爲什麼android允許刪除正在使用的文件.....?
- 22. 從集合中隨機返回項目
- 23. 爲什麼Emacs允許零除?
- 24. 爲什麼TypeScript允許我省略函數的返回類型?
- 25. 爲什麼聚合不允許在SQL條款
- 26. 爲什麼觸發器集合不允許數據觸發器
- 27. 從集合中刪除集合
- 28. 爲什麼python不允許我刪除文件?
- 29. 爲什麼git不允許我安全地刪除分支?
- 30. 爲什麼用戶界面不允許你刪除開發者?
這個問題似乎是關於爲什麼它被允許,而不是它是如何做的。 – Kevin
@凱文 - 好點。我似乎錯過了這個細微差別:)我會在這裏留下這個答案,因爲有人在這個問題上發現它可能會發現它的相關性。 – cdeszaq