假设我有这样的Hashtable:
Hashtable<Object, Object> test = new Hashtable<>();
test.put("t", 1);
test.put(2, "t123");
test.put(3, true);
如何在不知道任何键或值的情况下从中返回任何值或从此哈希表中获取任何键?我应该只是迭代它并得到第一个值,或者可能有更简单的更好的方法吗?
答案 0 :(得分:1)
您可以将所有条目放入List中,然后使用随机索引检索随机条目。
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 :(得分:1)
如果你的意思是“任何”:
test.keys().nextElement();
或
test.element().nextElement();
答案 2 :(得分:1)
您无法从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
。
答案 3 :(得分: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)
。