我有一个 Java 集(特别是 HashSet)。假设它的大小为 10k。我怎样才能把它分成 5 组,每组 2k 大小?
问问题
21236 次
5 回答
7
此方法将拆分集合的元素,以便第一个集合包含第一个 2000,第二个包含下一个 2000,依此类推。
public static <T> List<Set<T>> split(Set<T> original, int count) {
// Create a list of sets to return.
ArrayList<Set<T>> result = new ArrayList<Set<T>>(count);
// Create an iterator for the original set.
Iterator<T> it = original.iterator();
// Calculate the required number of elements for each set.
int each = original.size() / count;
// Create each new set.
for (int i = 0; i < count; i++) {
HashSet<T> s = new HashSet<T>(original.size() / count + 1);
result.add(s);
for (int j = 0; j < each && it.hasNext(); j++) {
s.add(it.next());
}
}
return result;
}
//As example, in your code...
Set<Integer> originalSet = new HashSet<Integer>();
// [fill the set...]
List<Set<Integer>> splitSets = split(originalSet, 5);
Set<Integer> first = splitSets.get(0); // etc.
于 2013-05-08T20:40:47.127 回答
0
我写了一些东西来分割集合。
它使用中间数组和列表。
它使用 Arrays.asList 和 Arrays.copyOfRange 方法。
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class SetSplitTest {
//define and initialize set
private static Set<Integer> largeSet;
static {
largeSet = new HashSet<Integer>();
for (int i = 0; i < 10000; i++) {
largeSet.add(i);
}
}
public static void main() {
System.out.println(largeSet);
int amountOfSets = 5; //amount of subsets wanted
Set<Integer>[] subsets = new Set[amountOfSets]; //array holding the subsets
Integer[] largesetarray = largeSet.toArray(new Integer[largeSet.size()]);
for (int i = 1; i <= amountOfSets; i++) {
int fromIndex = (i-1) * largeSet.size() / amountOfSets;
int toIndex = i * largeSet.size() / amountOfSets - 1;
Set<Integer> subHashSet = new HashSet<Integer>();
subHashSet.addAll(Arrays.asList(Arrays.copyOfRange(largesetarray, fromIndex, toIndex)));
subsets[i - 1] = subHashSet;
}
for (Set<Integer> subset : subsets) {
System.out.println(subset);
}
}
}
这绝对不是最优雅的解决方案,但当我不想自己循环设置时,这是我能想到的最好的解决方案。
于 2013-05-08T21:07:18.733 回答
-1
遍历整个集合,并将前 2000 个元素添加到第一个新集合中,将第二个 2000 个元素添加到第二个新集合中,等等。
于 2013-05-08T20:40:22.450 回答