java - 找到 N 个通过给定条件的第一个元素:求和给定的数字
问题描述
我有Pocket
实例列表
List<Pocket> pockets;
其中Pocket
类如下所示:
public class Pocket {
String name;
Double amount;
}
口袋列表示例:
[
{"pocket1", 280},
{"pocket2", 320},
{"pocket3", 100},
{"pocket4", 125},
{"pocket5", 150},
{"pocket6", 175}
]
我需要从给定的口袋列表中找到n
可以一起提供N
(例如 650 个)的第一个口袋。如果最后一个口袋amount
比需要的大,这个口袋应该分成两个口袋,结果列表应该只包含一个与前面的n - 1
口袋一起给出的部分N
。
例如,我需要按顺序排列的口袋列表,就像 source list 一样,它一起给出了 amount 650
。请注意,口袋被分割了,最后一个口袋3-rd
只返回了一半:amount
[
{"pocket1", 280},
{"pocket2", 320},
{"pocket3", 50}
]
如何实现它Java Streams
?
解决方案
你可以使用flatMap
andStream
来做到这一点。请参见下面的示例:
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
public class Lambda {
public static void main(String[] args) {
List<Pocket> pockets = Arrays.asList(
new Pocket("pocket1", 280D),
new Pocket("pocket2", 320D),
new Pocket("pocket3", 100D),
new Pocket("pocket4", 50D));
System.out.println("Filtered");
pockets.stream()
.flatMap(new SplitFunction(651))
.forEach(System.out::println);
System.out.println("Original");
pockets.forEach(System.out::println);
}
}
class SplitFunction implements Function<Pocket, Stream<Pocket>> {
private double max;
public SplitFunction(double max) {
this.max = max;
}
@Override
public Stream<Pocket> apply(Pocket pocket) {
if (Double.compare(max, pocket.amount) >= 0) {
max -= pocket.amount;
return Stream.of(pocket);
} else if (Double.compare(max, 0.0) > 0) {
Pocket lastPocket = new Pocket(pocket.name, max);
max = 0;
return Stream.of(lastPocket);
}
return Stream.empty();
}
}
上面的代码打印:
Filtered
Pocket{name='pocket1', amount=280.0}
Pocket{name='pocket2', amount=320.0}
Pocket{name='pocket3', amount=51.0}
Original
Pocket{name='pocket1', amount=280.0}
Pocket{name='pocket2', amount=320.0}
Pocket{name='pocket3', amount=100.0}
Pocket{name='pocket4', amount=50.0}
推荐阅读
- javascript - FCM 发送一批消息(设备组)
- javascript - 尝试使用 forEach 方法转换数组中的单词并将它们输出到页面上,但每个条目都会覆盖前一个条目?
- java - Swing GridBagLayout:将第二行的按钮居中
- javascript - 在 javascript 的文本中显示用户名和密码值
- c - 如何在不丢弃旧记忆的情况下使用 realloc 功能
- node.js - 社交媒体处理程序的猫鼬模式模型(如何)
- google-cloud-platform - 是否可以针对 BigQuery SQL 查询制定自定义指标?
- json - 需要 Json Response 被查询并绑定到模态视图
- javascript - 带有回调的Sinon测试函数调用
- docker - Jenkins:创建管道以读取 dockerfile