【发布时间】:2020-12-11 08:54:03
【问题描述】:
我有一个字符串列表(["A", "B", ...]) 和一个大小列表([4,7,...])。我想从最初位于i 位置的字符串出现sizes[i] 次的字符串集中进行采样而不进行替换。我必须执行此操作k 次。显然,如果我选择字符串i,那么sizes[i] 减1。我开发的当前简单的解决方案是生成整个输入集,打乱它,并迭代地弹出数组的第一个元素。这显然是低效的,因为如果一个字符串出现 100 万次,我将不得不生成 100 万个条目。
public static void main(String[] args) {
String[] elems = { "A", "B", "C", "D", "E" };
Integer[] sizes = { 10, 5, 4, 7, 3 };
int k = 3;
ArrayList<String> bag = new ArrayList<>();
for (int i = 0; i < elems.length; i++) {
for (int j = 0; j < sizes[i]; j++) {
bag.add(elems[i]);
}
}
Collections.shuffle(bag);
for (int i = 0; i < k; i++) {
System.out.println(bag.remove(0));
}
}
是否有更好、更有效的方法来执行此操作?谢谢。
【问题讨论】:
-
那你为什么要删除它?由于它是一个 ArrayList,因此您可以通过索引 (
bag.get(i)) 访问第一个k元素。当需要下一个k元素时,期望是什么?原包应该恢复吗? -
你是对的。我可以访问第一个
k元素。最后,结果还是和我想的一样
标签: java arrays sorting probability