【发布时间】:2022-01-22 05:33:18
【问题描述】:
我有一个名为“文件”的实体,具有以下属性:
public class File {
private int id;
private String proposal;
private String hash;
private String path;
private LocalDateTime createdAt;
private LocalDateTime finishedAt;
private int size;
private boolean processed;
}
我需要组织一个队列,将哪些文件上传到特定服务。对于每次提交,我可以发送尽可能多的文件,只要它们的大小总和不超过 100mb。此外,我必须尊重每个文件允许的最大日期(在这种情况下涉及finishedAt 属性)。
我已经设法对我的列表进行排序。换句话说,我能够确定首先上传哪些文件:
files.sort(Comparator.comparing(File::getFinishedAt));
files.stream().forEach(file -> System.out.println(file.getId()));
现在我想组装一个数组,其中包含每次提交时将排序的文件列表。类似的东西:
[[1, 4, 7], [8, 2], [6, 3], [5]]
上述数组的每个“子集”都与上传有关。上面是我的文件的 ID。所以我希望我的程序返回一个数组数组,其中每个集合都包含尽可能多的文件(只要它们的总和不超过 100mb)。由于每条记录都有截止日期 (finishedAt),因此它们也需要按顺序排列。
最合适的方法是什么?我试图理解 Java 中的 Streams,但我能做的最多就是根据日期对列表进行排序。使用 Streams 我可以达到我展示的结果吗?实现这些目标最合适的方法是什么?
非常感谢!
【问题讨论】:
-
不清楚你想做什么。
[[1, 4, 7], [8, 2], [6, 3], [5]]是File[][](或List<List<File>>)类型吗?这是您的程序的结果,还是您的程序的输入?各个组(如1, 4, 7)代表什么? “尊重提交的最长时间”是什么意思?一些示例输入及其相应的输出可能会阐明您的目标。 -
哦。 @VGR,我真的没有足够清楚地说明这些问题。我将编辑我的问题,但该数组是一个处理响应,它向我显示必须在每批中上传的文件的 ID。换句话说:从包含所有注册文件的列表中,我的程序必须设置上传顺序。每次上传可以有多个文件,但它们的总和不能超过 100mb。此外,每个文件都有一个最大上传日期。我的目的是根据这些要求(finishedAt 和大小)确定每批中将发送哪些文件。
-
在我看来(因此不是官方答案),你想要做的不是一个好的流用例。到目前为止您所拥有的部分很好,但我会将分块部分编写为您当前拥有的列表的循环,构建列表直到它们“满”,然后将每个列表添加到“列表列表” .即使您确实使用流进行了此操作,代码也可能不太容易理解,从而导致维护头痛。
-
我认为你是对的,@GreyBeardedGeek 关键是我对 Java 不是很流利,所以我认为一切都应该以“Java 8”的方式完成。考虑到您所说的,我会看看是否可以更接近解决方案。如果不是要求太多,你能给我举个例子或者给我一些我可以创建这个数组数组的内容吗?
-
是否保证每个文件的大小在100MB以下?否则,可能需要额外拆分文件以适应大小限制。
标签: java arrays arraylist collections java-stream