怎么高效的从一个有几十万个KEY的Map中随机获取一批数据。我需要运行效率高的代码 需要真随机
时间: 2024-02-12 16:09:56 浏览: 62
如何快捷有效地获取海量数据并使其可被机器识别分析
如果需要真正的随机性,可以考虑将Map中的所有key存储在数组中,然后使用Fisher-Yates shuffle算法对数组进行洗牌,最后取出前batchSize个元素对应的value。Fisher-Yates shuffle算法是一种流行的随机排序算法,它的时间复杂度为O(n)。以下是Java代码示例:
```java
import java.util.*;
public class RandomMapValues {
public static void main(String[] args) {
// 创建一个有几十万个KEY的Map
Map<Integer, String> map = new HashMap<>();
for (int i = 0; i < 100000; i++) {
map.put(i, "value" + i);
}
// 将所有的key存入数组中
Integer[] keys = map.keySet().toArray(new Integer[0]);
// 使用Fisher-Yates shuffle算法对数组进行洗牌
Random random = new Random();
for (int i = keys.length - 1; i >= 1; i--) {
int j = random.nextInt(i + 1);
int temp = keys[i];
keys[i] = keys[j];
keys[j] = temp;
}
// 随机获取一批数据
int batchSize = 100;
List<String> values = new ArrayList<>();
for (int i = 0; i < batchSize; i++) {
String value = map.get(keys[i]);
values.add(value);
}
System.out.println(values);
}
}
```
在这个例子中,我们首先将Map中的所有key存储在数组中,然后使用Fisher-Yates shuffle算法对数组进行洗牌。最后,我们取出前batchSize个元素对应的value,存储在一个`List`中。由于Fisher-Yates shuffle算法的时间复杂度为O(n),因此这个方法可以保证真正的随机性。
阅读全文