0

我正在解决一个需要从 keySet 中提取随机字符串的问题。只是想知道是否有人可以在这里给我一些指导。我很迷茫。如果我使用的是 int,而不是 String,我已经找到了很多方法来做到这一点。例如,我想对用户进行关于州及其首都的测验,并从问题的 keySet 中提取一个随机密钥。这是套装:

Set<String> states = stateCapitals.keySet();
4

5 回答 5

3

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

于 2021-02-17T04:42:53.480 回答
1

类似于 HashSet 的 keySet 是无序的,因此不能保证集合中元素的顺序。因此,从一组中拉出随机字符串可能不是那么有效。

将集合转换为数组或列表,然后执行随机字符串获取可能是一个不错的解决方案。

于 2021-02-17T04:59:19.430 回答
0
ArrayList<States> statesList = new ArrayList<>( states );
State x = statesList.get( (int)(statesList.size() * Math.random()) );

上面的代码会得到你想要的,但如果它是一个非常大的列表,这可能会效率低下。

于 2021-02-17T04:50:45.347 回答
0

试试这个代码

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]);
            }
        }
于 2021-02-17T05:10:25.523 回答
0
String ranKey = map.keySet().toArray()[new Random().nextInt(map.keySet().size())].toString();
于 2021-02-17T05:01:17.987 回答