讓說,我有這樣的哈希表:Java - 散列表返回任何值或任何鍵?
Hashtable<Object, Object> test = new Hashtable<>();
test.put("t", 1);
test.put(2, "t123");
test.put(3, true);
我怎麼可能剛剛從它返回任何值或者從該哈希表中的任意鍵不知道任何鍵或價值?我應該只是迭代它並獲得第一個價值,或者有更簡單更好的方法嗎?
讓說,我有這樣的哈希表:Java - 散列表返回任何值或任何鍵?
Hashtable<Object, Object> test = new Hashtable<>();
test.put("t", 1);
test.put(2, "t123");
test.put(3, true);
我怎麼可能剛剛從它返回任何值或者從該哈希表中的任意鍵不知道任何鍵或價值?我應該只是迭代它並獲得第一個價值,或者有更簡單更好的方法嗎?
您可以將所有條目放入列表中,然後使用隨機索引檢索隨機條目。
Hashtable<Object, Object> test = new Hashtable<Object, Object>();
test.put("t", 1);
test.put(2, "t123");
test.put(3, true);
List<Entry<Object, Object>> entries = new ArrayList<Entry<Object, Object>>(test.entrySet());
Random random = new Random();
Entry<Object, Object> randomEntry = entries.get(random.nextInt(entries.size()));
Object randomValue = randomEntry.getValue();
Object randomKey = randomEntry.getKey();
爲O不能從哈希表中獲得一個隨機元素(1),但最有效的在O(n)中這樣做的方法是這樣的:
int chosenIndex = (int) Math.random()*map.size();
i = 0;
for (Object v : map.values())
if (i++ == chosenIndex)
return v;
順便說一句,從來沒有使用Hashtable
類,它仍然只是爲了向後兼容。使用HashMap
。
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put(10, "ddsadas");
map.put(23, "sdss");
map.put(24, "sdss");
map.put(90, "sdss");
現在隨機密鑰生成O(N)
:
int size = map.keySet().size();
int index=(int)(Math.random() * size)+1;
System.out.println(index);
for(Integer i : map.keySet()){
if(index==1){
System.out.println(i);
break;
}
else{
index--;
}
}
您可以O(1)
通過將出現在設置爲一個數組實現這一目標,並生成數組的索引當中的隨機數,只是返回值在數組的索引中。這是o(1)
。
我認爲它有entrySet()方法,這可能有幫助。但爲什麼一個hashtable而不是arraylist或數組?爲什麼你需要字符串鍵? – MightyPork