列出分区

时间:2017-05-17 11:00:05

标签: java list split

我需要获得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=2testFolds.size()=3,因为Lists.partition将分为大小为2的折叠。我该怎么办,总有5折?

2 个答案:

答案 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