2013-11-21 2 views
1

Пусть говорят, у меня есть такая Hashtable:Java - hashtable возвращает любое значение или любую клавишу?

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

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

Как я мог просто вернуть любое значение из него или получить какой-либо ключ от этой хэш-таблицы не зная ключа или значение? Должен ли я просто повторить его и получить первое значение, или, может быть, есть более простой способ?

+0

У меня есть метод entrySet(), который может помочь. Но почему хеш-таблица вместо массива или массива? Зачем вам нужны строковые ключи? – 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

Вы не можете получить случайный элемент из Hashtable в O (1), но наиболее эффективным способ сделать это в O (n) будет примерно таким:

int chosenIndex = (int) Math.random()*map.size(); 
    i = 0; 
for (Object v : map.values()) 
    if (i++ == chosenIndex) 
    return v; 

BTW никогда не использует класс Hashtable, который по-прежнему используется только для обратной совместимости. Используйте HashMap.

+0

Я думаю, что мы ушли слишком далеко, OP хочет «любой» ключ, кажется, я просто выброшу первое значение. См. Обсуждение ниже. :) – Trying

+0

Да, я это видел. Но поскольку формулировка вопроса подразумевает случайный элемент, эта страница все равно может быть достигнута кем-то, действительно нуждающимся в случайном элементе из хеш-таблицы. –

+0

Марко Топольник очень прав. – 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).

Смежные вопросы