我需要获得20%的书籍,并将它们分成5倍。目前,做了以下
List<Integer> nonRatedBooks= allBookIDs;
Collections.shuffle(nonRatedBooks);
nonRatedBooks= nonRatedBooks.subList(0, (int) Math.ceil(nonRatedBooks.size() * 0.2));
int foldSize = (int) Math.ceil((float)nonRatedBooks.size() / 5);
List<List<Integer>> testFolds = Lists.partition(nonRatedBooks, foldSize);
问题在于,例如我有nonRatedBooks.size()=6
(在获取子列表后),然后是foldsize=2
和testFolds.size()=3
,因为Lists.partition
将分为大小为2的折叠。我该怎么办,总有5折?
答案 0 :(得分:1)
这应该对你有用:
// get your 20% first
int chunk = nonRatedBooks.size() / 5;
List<List<Integer>> result = new LinkedList<List<Integer>>();
if (chunk < 1) {
nonRatedBooks.stream().map(Lists::newArrayList).collect(Collectors.toCollection(() -> result));
} else {
for (int i = 0; i < 5; i++) {
int endIndex = i < 4 ? (i + 1) * chunk : nonRatedBooks.size();
result.add(nonRatedBooks.subList(i * chunk, endIndex));
}
}
Lists.partition在你的情况下不是最好的解决方案,因为它会打破你的列表取决于分区大小的变化。
答案 1 :(得分:0)
将整数值除以小数量的两个部分的更加防弹的方法只需要一个除法:
int total = ...;
float ratio = ...; // presumably from [0.0 .. 1.0] range
int part = Math.round(total * ratio);
int remaining = total - part;
这可确保part
+ remaining
总计为total
。