从哈希表中检索随机密钥

时间:2018-08-12 18:59:20

标签: java random hashtable

好吧,我认为所有内容都在标题中...

但是要更清楚一点:我有一个哈希表,其中的键是字符串(更确切地说是用户名),值是个人类,比方说UserData。所以很明显,我使用此表来检索一些知道用户名的UserData;但是有时候我想取一个随机的用户名。

这就是为什么我需要找到一种在哈希表中选择随机密钥的方法。

我已经尝试过:

            Random random = new Random();
            int randomIndex = random.nextInt(myHashtable.size())-1;
            String[] names = null;
            myHashtable.keySet().toArray(names);
            String randomUser = names[randomIndex];
            System.out.println(randomUser);

但是它不起作用(我因错误使用Random出现错误,对不起,我现在没有详细信息)

2 个答案:

答案 0 :(得分:2)

问题一:nextInt(n)返回0到n-1范围内的值。按当前方式添加-1会产生-1到n-2范围内的值(即错误)

问题二:myHashtable.keySet().toArray(names);返回一个填充有keys的数组(它不会分配并填充该数组)。

int len = myHashtable.size();
int randomIndex = random.nextInt(len);
String[] names = myHashtable.keySet().toArray(new String[len]); // sizing the
   // array is optional, but you have the length - and if you don't specify it
   // then it will be re-computed.

答案 1 :(得分:1)

您可以将Set转换为List并使用ThreadLocalRandom获取范围文档here之间的随机值,这种方法避免了创建Random实例

    List<String> l = new ArrayList<>(myHashtable.keySet());
    System.out.println(l.get(ThreadLocalRandom.current().nextInt(0, l.size())));
  

public int nextInt(int origin,                      整数约束)

     

返回指定原点(包括端点)和指定边界(不包括端点)之间的伪随机整数值。