我正在解决一个需要从 keySet 中提取随机字符串的问题。只是想知道是否有人可以在这里给我一些指导。我很迷茫。如果我使用的是 int,而不是 String,我已经找到了很多方法来做到这一点。例如,我想对用户进行关于州及其首都的测验,并从问题的 keySet 中提取一个随机密钥。这是套装:
Set<String> states = stateCapitals.keySet();
Set
不是随机索引的最佳数据结构。
更好地转换为 aList
并使用随机生成器来选择index
. 如果你真的需要留在 a Set
,你可以生成一个随机索引n
并遍历Set
,停在nth element
. 对于选择多个元素,使用List
. 任何iterable
都会好的。
关键思想是动态调整选择概率,以便您可以选择 m(超出 sizeof(Set)):在最简单的示例中m=1
,选择概率为 的第一个元素1/N
,如果您没有选择它,则选择2nd element
概率1/(N-1)
..and很快。
使用条件概率表明所有元素都是在公平的机会下被选中的1/N
。
类似于 HashSet 的 keySet 是无序的,因此不能保证集合中元素的顺序。因此,从一组中拉出随机字符串可能不是那么有效。
将集合转换为数组或列表,然后执行随机字符串获取可能是一个不错的解决方案。
ArrayList<States> statesList = new ArrayList<>( states );
State x = statesList.get( (int)(statesList.size() * Math.random()) );
上面的代码会得到你想要的,但如果它是一个非常大的列表,这可能会效率低下。
试试这个代码
onPress: function () {
debugger;
var textArray = ['Pritesh', 'Nimesh', 'Harshil', 'Ravi', 'Amit', 'Brijesh'];
var randomNumber = Math.floor(Math.random() * textArray.length);
for (var i = 0; i < textArray.length; i++) {
if (i === randomNumber) {
console.log(textArray[i]);
}
}
String ranKey = map.keySet().toArray()[new Random().nextInt(map.keySet().size())].toString();