从哈希表中检索随机密钥
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.
嗯,我想一切都在标题中......
但要说得更清楚:我有一个 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.