2013-11-21 35 views
1

讓說,我有這樣的哈希表:Java - 散列表返回任何值或任何鍵?

Hashtable<Object, Object> test = new Hashtable<>(); 

test.put("t", 1); 
test.put(2, "t123"); 
test.put(3, true); 

我怎麼可能剛剛從它返回任何值或者從該哈希表中的任意鍵不知道任何鍵或價值?我應該只是迭代它並獲得第一個價值,或者有更簡單更好的方法嗎?

+0

我認爲它有entrySet()方法,這可能有幫助。但爲什麼一個hashtable而不是arraylist或數組?爲什麼你需要字符串鍵? – MightyPork

回答

1

如果你的意思是 「任何」:

test.keys().nextElement(); 

test.element().nextElement(); 
+0

謝謝。這個很簡單,很好。是的,我的意思是隨機或任何:) – Andrius

+0

隨機意味着分佈在整個樣本空間,這不在這裏發生。 – Trying

+0

我知道它是什麼意思,但我可以看到作者寫了「是的,我的意思是隨機或任何」。 –

1

您可以將所有條目放入列表中,然後使用隨機索引檢索隨機條目。

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(); 
1

爲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

+0

我認爲我們已經走得太前面,OP想要任何關鍵似乎只是拋出第一個值。請參閱下面的討論。 :) – Trying

+0

是的,我看到了。但是由於這個問題的措辭意味着一個隨機元素,這個頁面仍然可以被某個實際需要散列表中隨機元素的人所訪問。 –

+0

Marko Topolnik非常真實。 – Trying

1
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)