我有N个项目,有重复项:
List<Item> items;
我想将它们放在m个大小的集合中,其中所有项目必须是不同的。
我尝试使用Guava's Multiset:
HashMultiset<Item> multiset = HashMultiset.create(items);
List<List<Item>> distribution = new ArrayList<>();
for(int i=0;i<N/m;i++){
Set<Item> unique = multiset.elementSet();
List<Item> randomized = new ArrayList<>(unique);
Collections.shuffle(randomized);
List<Item> pack = new ArrayList<>();
for(int j=0;j<m;j++){
pack.add(randomized.get(j));
}
for(int j=0;j<m;j++){
multiset.remove(randomized.get(j));
}
distribution.add(pack);
}
此方法生成唯一的项目组合,直到最后,没有唯一的元素留在最后几个包中。所以它失败了数组越界异常。
我知道这个算法可以修改为接受非唯一包,但我的问题是如何产生完全独特的分发?
对于直观表示,以下是项目的示例列表:(N = 30,m = 3) A,A,A,A,A,B,B,B,B,C,C,C,C,C,C,C,d,d,d,d,E,E,E,F,F, F,F,F,F,F
达到产量: [A,B,F] [B,D,F] [B,D,F] [A,D,E] ...... [F,F,C](注意最后一个不是内部唯一的)
预期产量: [A,B,F] [B,D,F] [B,D,F] [F,D,E] ... [A,F,C]