好吧,我认为所有内容都在标题中...
但是要更清楚一点:我有一个哈希表,其中的键是字符串(更确切地说是用户名),值是个人类,比方说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出现错误,对不起,我现在没有详细信息)
答案 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, 整数约束)
返回指定原点(包括端点)和指定边界(不包括端点)之间的伪随机整数值。