从哈希表中检索随机密钥

Retrieve random key from Hashtable

嗯,我想一切都在标题中......

但要说得更清楚:我有一个 Hashtable,其中键是字符串(更准确地说:用户名),值是个人 class,比方说 UserData。所以很明显我使用这个 table 来检索一些知道用户名的用户数据;但有时我想取一个随机的用户名。

这就是为什么我需要找到一种方法来 select 我的哈希 table 中的随机密钥。

我试过:

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

但它不起作用(我收到错误使用随机数的错误,抱歉,我现在没有详细信息)

您可以将 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, int bound)

Returns a pseudorandom int value between the specified origin (inclusive) and the specified bound (exclusive).

问题一:nextInt(n) returns 范围为 0 到 n - 1 的值。按照您当前的方式添加 -1 会得到范围为 -1 到 n - 1 的值n - 2(错误)

问题二:myHashtable.keySet().toArray(names); returns 一个用 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.