为了账号安全,请及时绑定邮箱和手机立即绑定

从哈希表中检索随机密钥

从哈希表中检索随机密钥

PIPIONE 2021-07-13 13:09:04
好吧,我想一切都在标题中......但为了更清楚地说明:我有一个哈希表,其中键是字符串(更准确地说:用户名),而值是个人类,比如说 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 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

问题一:nextInt(n)返回 0 到 n - 1 范围内的值。-1按您目前的做法添加 a会导致 -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.


查看完整回答
反对 回复 2021-07-14
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

您可以在此处转换SetList并用于ThreadLocalRandom获取范围文档之间的随机值,这种方法避免了创建实例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)

返回指定原点(包含)和指定边界(不包含)之间的伪随机 int 值。


查看完整回答
反对 回复 2021-07-14
  • 2 回答
  • 0 关注
  • 178 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信