gpt4 book ai didi

java - 根据条件拆分对象集合

转载 作者:行者123 更新时间:2023-12-01 19:31:23 24 4
gpt4 key购买 nike

我有一个要添加到袋子中的元素列表,袋子容量为 100 数量

物体和袋子如下所示

public class MyObject{
String id;
int qty;
}

public class MyBag{
String id;
int qty;
}

有没有办法使用 Java 8 流在数量限制上将 MyObject 拆分为多个 MyBags 分组

例如:myObjects 是

[myObject1:{id1, 150}, 
myObject2:{id2, 30},
myObject3:{id3, 150}]

因为袋子的容量为 100。包应分组为

[ bag1:[{id1, 100}], 
bag2:[{id1, 50},{id2, 30},{id3, 20}],
bag3:[{id3, 100}],
bag4:[{id3, 30}]]

最佳答案

由于它是在评论中维护的,因此解决方案并不容易。下面是一个接近您想要的示例。首先,我只使用了第一类 MyObject 并对其进行了一些更改。

public class MyObject{
String id;
int qty;

public MyObject(String id, int qty) {
this.id = id;
this.qty = qty;
}

@Override
public String toString() {
return "MyObject{" +
"id='" + id + '\'' +
", qty=" + qty +
'}';
}
}

初始化代码:

List<MyObject> myObjects = Arrays.asList(
new MyObject("id1", 150),
new MyObject("id2", 30),
new MyObject("id3", 150)
);

以及主要代码。在 flatMap 中,将 MyObject 拆分为大的 qty。之后,对象被收集到具有给定限制的列表中。输出并不完全如您所愿。第三个列表包含两个带有标识符 id3 的对象。

[MyObject{id='id1', qty=100}]
[MyObject{id='id1', qty=50}, MyObject{id='id2', qty=30}, MyObject{id='id3', qty=20}]
[MyObject{id='id3', qty=80}, MyObject{id='id3', qty=20}]
[MyObject{id='id3', qty=30}]
LinkedList<List<MyObject>> firstCollection = myObjects.stream()
.flatMap(o -> o.qty < 100 ? Stream.of(o) : IntStream.range(0, (o.qty / 100 + 1))
.mapToObj(x -> new MyObject(o.id, x < o.qty / 100 ? 100 : o.qty % 100))
)
.collect(
Collector.of(
LinkedList::new,
(a, b) -> Optional.of(a).filter(Predicate.not(List::isEmpty))
.map(l -> l.getLast().stream().map(o -> o.qty).reduce(Integer::sum).get())
.filter(lastSum -> lastSum < 100)
.ifPresentOrElse(lastSum -> {
int maxQty = 100 - lastSum;
if (maxQty >= b.qty) {
a.getLast().add(b);
} else {
a.getLast().add(new MyObject(b.id, maxQty));
a.add(new ArrayList<>(List.of(new MyObject(b.id, b.qty - maxQty))));
}
}, () -> a.add(new ArrayList<>(List.of(b))))
,
(a, b) -> { throw new UnsupportedOperationException();}
)
);
firstCollection.forEach(System.out::println);

关于java - 根据条件拆分对象集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59701676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com