簡體   English   中英

隨機訪問 HashMap 個密鑰

[英]Random access for HashMap keys

我需要隨機訪問 HashMap 中的鍵。現在,我在HashMap的 keySet() 返回的Set上使用Set的 toArray() 方法,並將其轉換為 String[](我的鍵是字符串)。 然后我使用Random從 String 數組中選擇一個隨機元素。

public String randomKey() {
    String[] keys = (String[]) myHashMap.keySet().toArray();
    Random rand = new Random();
    return keyring[rand.nextInt(keyring.length)];
}

似乎應該有一種更優雅的方式來做到這一點,我已經閱讀了以下帖子。 但它似乎比我這樣做的方式更令人費解,如果以下解決方案更好? 為什么? 從 Java 中的 Map 中選擇隨機鍵和值集

HashMap沒有設施可在不知道鍵的情況下返回條目,因此,如果您只想使用該類,那么所擁有的解決方案可能與任何解決方案一樣好。

但是請記住,實際上您並不限於使用HashMap

如果你要來讀這個集合的次數遠遠多於寫它,你可以創建自己的類,它包含一個HashMap映射的和不同的集合,它允許隨機訪問(如按鍵的Vector )。

這樣,您就不會在每次閱讀時都將地圖轉換為集合然后轉換為數組的成本它只會在必要時發生(在集合中添加或刪除項目)。

不幸的是, Vector允許多個具有相同值的鍵,因此在插入時您必須對此加以防范(以確保選擇隨機鍵時的公平性)。 這將增加插入成本。

刪除也將增加成本,因為您必須搜索要從向量中刪除的項目。

我不確定是否為此目的有一個簡單的收藏。 如果您想全力以赴,則可以使用當前的HashMap ,鍵的Vector另一個將鍵映射到矢量索引的HashMap

這樣,所有操作(插入,刪除,更改,獲取隨機)在時間上都是O(1),在時間方面非常高效,而在空間方面則可能效率較低:-)

或者有一種中途解決方案仍然使用包裝器,但是每當您插入,更改或刪除鍵時都會創建一個長壽命的字符串數組。 這樣,您僅在需要時創建陣列,而且仍可以攤銷成本。 然后,您的類使用哈希圖通過鍵進行有效訪問,並使用數組進行隨機選擇。

而且那里的變化很小。 您已經具有創建數組的代碼,只需創建包裝器類即可提供HashMap所需的任何內容(並將大多數調用傳遞HashMap )以及一個額外的函數來獲取隨機密鑰(使用數組) )。


現在,如果性能實際上是一個問題,我只會考慮使用那些方法。 您可以花費無數的時間以無關緊要的方式提高代碼速度:-)

如果您擁有的足夠快,那就沒問題了。

為什么不使用Collections.shuffle方法,將其保存到變量,然后根據需要從頂部彈出一個。

http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#shuffle(java.util.List)

通過先獲取大小,選擇隨機索引,然后在鍵集上進行適當的次數迭代,可以避免將整個鍵集復制到臨時數據結構中。

該代碼將需要同步以避免並發修改。

如果您真的只想要集合中的任何元素,這會很好用。

String s = set.iterator().next();

如果不確定集合中是否有元素,請使用:

String s;
Iterator<String> it = set.iterator();
if (it.hasNext()) {
    s = it.next();
}
else {
    // set was empty
}

暫無
暫無

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

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