簡體   English   中英

給定Java中的鍵,隨機訪問映射項

[英]Randomly access map entry given the key in java

我有Map<?, String>類型的字典。 密鑰類型在運行時未知。 我仍然可以使用字符串來調用get() ,如果存在這樣的元素,則可以正確獲取存儲的對象。

現在,我修改該對象,並將其放回字典中。 理想情況下,我想做這樣的事情:

    Map<String, String> hat = new HashMap<>();
    hat.put("bunny", "rabbit");
    Map<?, String> magicHat = hat;
    String trick = magicHat.get("bunny");
    if (trick != null) {
        trick = "jack".concat(trick);
        magicHat.put("bunny", trick);
    }

但是,可以理解的是,調用magicHat.put("bunny", trick); 給出以下編譯錯誤: incompatible types: String cannot be converted to CAP#1

解決它的一種方法是使用流(或迭代)獲取地圖的條目,然后使用該條目修改值:

    Map.Entry<?, String> entry = magicHat.entrySet()
        .stream()
        .filter(e -> "bunny".equals(e.getKey()))
        .findFirst()
        .orElse(null);
    if (entry != null) {
        String trick = "jack".concat(entry.getValue());
        entry.setValue(trick);
    }

但是,在現實生活中,我受Java 6的約束,無法承受流的舒適性。 遍歷所有條目似乎效率很低。

給定鍵,是否有一種優雅的方法可以隨機訪問地圖中的條目?

這是未編譯的代碼, 這是解決方法。

感謝您的見解。

您應該將鍵類型設置為Object而不是通配符(?)。 這樣,您不必知道類型。 但是,您應該確保不要在地圖中存儲不同類型的鍵。

Map<String, String> hat = new HashMap<>();
hat.put("bunny", "rabbit");
Map<Object, String> magicHat = new HashMap<>();
hat.forEach(magicHat::put); // Edit: Added this
String trick = magicHat.get("bunny"); // String extends Object
if (trick != null) {
    trick = "old".concat(trick);
    magicHat.put("bunny", trick);
}

在大多數情況下,解決此問題的方法是改為使用通用類型變量。 這樣,您仍然具有類型安全性,但不必在編譯時知道鍵類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM