- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个订单列表,我应该按两个标准对其进行分组。
Order_Id| Customer | Date | Amount |
1 | "Sam" | 2019-03-21 | 100 |
2 | "Nick" | 2019-03-21 | 102 |
3 | "Dan" | 2019-03-21 | 300 |
4 | "Sam" | 2019-04-21 | 400 |
5 | "Jenny" | 2019-04-21 | 220 |
6 | "Jenny" | 2019-04-12 | 330 |
对于当前示例,应该找到每个月总金额的最高买家:
{
MARCH: { customer='Dan', amount=300 },
APRIL: { customer='Jenny', amount=550 }
}
我找到了一个解决方案:
public class Main {
public static void main(String[] args) {
List<Order> orders = List.of(
new Order(1L, "Sam", LocalDate.of(2019, 3, 21), 100L),
new Order(2L, "Nick", LocalDate.of(2019, 3, 21), 102L),
new Order(3L, "Dan", LocalDate.of(2019, 3, 21), 300L),
new Order(4L, "Sam", LocalDate.of(2019, 4, 21), 400L),
new Order(5L, "Jenny", LocalDate.of(2019, 4, 21), 220L),
new Order(6L, "Jenny", LocalDate.of(2019, 4, 12), 330L)
);
solution1(orders);
}
private static void solution1(List<Order> orders) {
final Map<Month, Map<String, Long>> buyersSummed = new HashMap<>();
for (Order order : orders) {
Map<String, Long> customerAmountMap = buyersSummed.computeIfAbsent(order.getOrderMonth(), mapping -> new HashMap<>());
customerAmountMap.putIfAbsent(order.getCustomer(), 0L);
Long customerAmount = customerAmountMap.get(order.getCustomer());
customerAmountMap.put(order.getCustomer(), customerAmount + order.getAmount());
}
final Map<Month, BuyerDetails> topBuyers = buyersSummed.entrySet().stream()
.collect(
toMap(Entry::getKey, customerAmountEntry -> customerAmountEntry.getValue().entrySet().stream()
.map(entry -> new BuyerDetails(entry.getKey(), entry.getValue()))
.max(Comparator.comparingLong(BuyerDetails::getAmount)).orElseThrow())
);
System.out.println(topBuyers);
}
}
我使用的数据模型:
class BuyerDetails {
String customer;
Long amount;
public BuyerDetails(String customer, Long amount) {
this.customer = customer;
this.amount = amount;
}
public String getCustomer() {
return customer;
}
public Long getAmount() {
return amount;
}
}
class Order {
Long id;
String customer;
LocalDate orderDate;
Long amount;
public Order(Long id, String customer, LocalDate orderDate, Long amount) {
this.id = id;
this.customer = customer;
this.orderDate = orderDate;
this.amount = amount;
}
public Long getId() {
return id;
}
public String getCustomer() {
return customer;
}
public LocalDate getOrderDate() {
return orderDate;
}
public Month getOrderMonth() {
return getOrderDate().getMonth();
}
public Long getAmount() {
return amount;
}
}
问题:
有没有办法在一个流中解决上述任务?
最佳答案
尝试使用 groupingBy
、summingLong
和 comparingLong
,如下所示
Map<Month, BuyerDetails> topBuyers = orders.stream()
.collect(Collectors.groupingBy(Order::getOrderMonth,
Collectors.groupingBy(Order::getCustomer,
Collectors.summingLong(Order::getAmount))))
.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
order -> order.getValue().entrySet().stream()
.max(Comparator.comparingLong(Map.Entry::getValue))
.map(cust -> new BuyerDetails(cust.getKey(), cust.getValue())).get()));
输出
{
"MARCH": { "customer": "Dan", "amount": 300 },
"APRIL": { "customer": "Jenny", "amount": 550 }
}
关于Java Streams - 按两个条件汇总结果分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57480592/
我怎样才能将 numberGrade 的值调高,如果它是 89.5,它会变成 90。numberGrade 被当作 double ,但将它设为 int 并不会向上或向下舍入。 public class
经过了漫长时间的移植和查询资料,得以解决一下嵌入式docker出现的问题,很多网上的资料全都是复制粘贴复制粘贴,找不到合适的解决方法让人很是苦恼,希望自己总结出的一些解决问题的经验给广大朋友减少一些
之前我是通过脚本来使用库的: 现在我使用 yarn 和 rollup 来构建带有下一个文件的项目。包.json: { "name": "maplib", "version": "1.0.0",
在 R 中,我正在尝试使用不同的窗口宽度对大向量(最多 400k 个元素)进行非常快速的滚动平均值,然后对于每个窗口宽度按每年的最大值汇总数据。下面的例子希望是清楚的。 我尝试了几种方法,到目前为止最
我想问一下我应该如何解决这个问题,因为我已经对这部分感到困惑和困惑。我已经使用这个命令全局安装了汇总 npm install --global rollup 但是,当我尝试运行“汇总”命令时,我应该期
我正在构建 javascript 库(更像是小部件),其中将包含一些 UI。我正在通过 javascript 向 DOM 添加 HTML 元素。要添加此 HTML,我有以下代码: async inse
我在显示一份报告时遇到了一些困难,该报告既可以将所有日期分组到月中,又可以对月中每天的“支出”求和。 我的 SQL 查询创建了这个:(检索所有日期) Date
我正在从事 Angular2 项目。我浏览了 Angular2 aot 文档并且能够生成 ngFactory 文件。我按照文档中的建议使用了 rollup js。我有一些非 es6 npm 包。我已经
我目前正在构建 Ionic 2-RC3 应用程序。但是自从我升级到 RC-1 后,我遇到了以下错误:(不确定它们是否保持不变,但你明白了)。 [15:16:17] rollup: Conflicti
Arabic, Egypt (ar_EG) -----------------------------阿拉伯语,埃及 Arabic, Israel (ar_IL) -----------------
我正在尝试汇总我的完全 es6 模块存储库,该存储库具有项目的本地导入/导出,以及对也是脚本或模块的依赖项的导入。 我也在尝试进行双重构建,通过汇总创建遗留的 iife 模块。 这仅适用于我的项目,没
我有一个由 DayTots 类对象组成的 VBA 集合(见下文) 我正在使用 For Each 遍历集合以创建一个 由汇总记录组成的新集合,基于日期 有什么方法可以用 Linq 做到这一点吗?我怀疑也
这是我第一次尝试理解/使用汇总。 我正在使用 this boilerplate因为它都是基于three.js,我也喜欢使用它。 到目前为止,我目前的(几乎肯定是不正确的)方法是: 从github下载样
我有两个 column_property 列,我想在 grandtotal 列中将它们加在一起。我希望能够根据 grandtotal 列进行排序和过滤。 如何对 subtotal 和 shipping
我收到以下错误消息: Error: Parse Error: Line 29: Unexpected token ILLEGAL 对应的代码行是 mobx 观察者装饰器: @observer clas
我真的坚持这一点,我真的很感激这方面的任何帮助。 目标是计算 Woocommerce 订单上每个类别中的项目数量,以便每个部分都可以以类别名称和产品数量为标题。例如: 汉堡 x 5 在此下方将是该订单
我正在从路由器收集传输数据;它提供每日,每月和每两分钟(间隔为120秒)的摘要。如果我在一天中(因此一个月中)重启路由器,则这些报告将不完整。但是,我仍然会得到间隔数据,并且可以对引导前后的记录进行汇
假设我有一个像这样的数据框: a b c d e f 1. 1 5 5 9 2 3 2. 4 7 3 1 4 6 3. 2 3 8 9
假设我有一个记录列表,我想通过取中位数来总结它。更具体地说,说我有 data Location = Location { x :: Double, y :: Double } 我有一个测量列表,我想将
我刚刚开始使用 AngularJS。我需要从 AngularJS 的书中升级这个购物车示例,以便所有 (items.price*item.quantity) 的总数显示在页面底部。实现它的推荐方法是什
我是一名优秀的程序员,十分优秀!