如何管理具有重叠范围的项目,其中根据值我获得匹配的项目



假设我有以下项目(未排序(:

A, with A.amount = 10
B, with B.amount = 100
C, with C.amount = 50
D, with D.amount = 50

现在,对于项目中的每个唯一金额边界AB,找到其范围包括值的项目并计算累积括号。所以:

AB=10 results in { A, B, C, D } -> cumulative bracket 210
AB=50 results in { B, C, D } -> cumulative bracket 200
AB=100 results in { B } -> cumulative bracket 100

它将像这样使用:

for (int AB : collectAmountBoundaries(items)) {
Collection<Item> itemsInBracket = findItemsForAB(items, AB);
// execute logic, calculations etc with cumulative bracket value for AB
}

现在我可以使用vanilla Java编写所有这些代码,首先手动将项目集合转换为AB→cumulativeBracketValue或其他东西的映射。但是,由于我正在使用范围和重叠逻辑,因此我觉得以某种方式可以解决涉及NavigableMap,范围逻辑或聪明的东西(感觉像是一种常见的模式(。或者也许使用流来执行收集分组?

我现在没有看到它。关于如何干净地解决这个问题的任何想法?

我认为,做一个简单的过滤器,然后将过滤结果添加到列表中并达到总数就足够了。

static ListAndCumalativeAmount getCR(List<Item> items, double amount) {
ListAndCumalativeAmount result = new ListAndCumalativeAmount();
items.stream().filter(item -> item.amount >= amount).forEach((i) -> {
result.getItems().add(i.name);
result.add(i.amount);
});
return result;
}
static class ListAndCumalativeAmount {
private List<String> items = new ArrayList<>();
private Double amount = new Double(0.0);
public List<String> getItems() {
return items;
}
public void add(double value) {
amount = amount + value;
}

public Double getAmount() {
return amount;
}
}

这是一种使用流和分组的方法:

Map<Integer, SimpleEntry<List<Item>, Double>> groupedByBracketBoundary = items.stream()
.collect(groupingBy(o -> o.getAmount())).entrySet().stream()
// map map-values to map-entries of original value and sum, keeping key the same
.collect(toMap(Entry::getKey, e -> new SimpleEntry<>(e.getValue(), 
e.getValue().stream()
.map(o -> o.getAmount())
.reduce(0d, (amount1, amount2) -> amount1 + amount2))));
LinkedHashSet<Integer> sortedUniqueAmountBoundaries = internalList.stream()
.map(o -> o.getAmount())
.sorted()
.collect(Collectors.toCollection(LinkedHashSet::new));
for (int ab : sortedUniqueAmountBoundaries) {
List<Item> itemsInBracket = groupedByBracketBoundary.get(ab).getKey();
double cumulativeAmountForBracket = groupedByBracketBoundary.get(ab).getValue();
// execute logic, calculations etc with cumulative bracket value for AB
}

不知何故,这感觉既简洁又冗长,相当密集。没有JDK api或第三方库可以做这种事情吗?

最新更新