Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用流从地图内部的地图获取数据_Java_Collections_Hashmap_Java Stream - Fatal编程技术网

Java 使用流从地图内部的地图获取数据

Java 使用流从地图内部的地图获取数据,java,collections,hashmap,java-stream,Java,Collections,Hashmap,Java Stream,我从嵌套在另一个地图中的地图接收数据时遇到问题 private Map<Customer, Map<Item,Integer>> orders; 使用我想得到的数据流,例如,为购买物品支付最多的客户,但我在从地图上获取这些数据时遇到了问题,使用列表并不是那么困难,但现在我无法找到它 好吧,我确实想出了这样的办法,它似乎是可行的,但我相信它可以简化 Customer key = customersMap.entrySet() .stream

我从嵌套在另一个地图中的地图接收数据时遇到问题

private Map<Customer, Map<Item,Integer>> orders;
使用我想得到的数据流,例如,为购买物品支付最多的客户,但我在从地图上获取这些数据时遇到了问题,使用列表并不是那么困难,但现在我无法找到它

好吧,我确实想出了这样的办法,它似乎是可行的,但我相信它可以简化

Customer key = customersMap.entrySet()
                .stream()
                .collect(Collectors.toMap(Map.Entry::getKey,
                        e -> e.getValue()
                                .entrySet()
                                .stream()
                                .map(o -> o.getKey().getPrice().multiply(BigDecimal.valueOf(o.getValue())))
                                .collect(Collectors.toList())))
                .entrySet()
                .stream()
                .collect(Collectors.toMap(Map.Entry::getKey, t -> t.getValue().stream().reduce(BigDecimal.ZERO, BigDecimal::add)))
                .entrySet()
                .stream()
                .max(Map.Entry.comparingByValue())
                .orElseThrow()
                .getKey();

你的回答Naman很有帮助,所以也许你可以给我一些建议。 这就是我从JSON接收它的方式

JsonConverterCustomer jsonConverterCustomer = new JsonConverterCustomer(FILENAME3);
List<Order> orders = jsonConverterCustomer.fromJson().orElseThrow();
 

Map<Customer, Map<Item, Integer>> customersMap = new HashMap<>();

        

for (Order order : orders) {
            if (!customersMap.containsKey(order.getCustomer())) {
                addNewCustomer(customersMap, order);
            } else {
                for (Product product : order.getItems()) {
                    if (!customersMap.get(order.getCustomer()).containsKey(items)) {
                        addNewCustomerItem(item, customersMap.get(order.getCustomer()));
                    } else {
                        updateCustomerItem(customersMap, order, item);
                    }
                }
            }
        }


private static void updateCustomerProduct(Map<Customer, Map<Item, Integer>> customersMap, Order order, Item item) {
        customersMap.get(order.getCustomer())
                .replace(item,
                        customersMap.get(order.getCustomer()).get(item),
                        customersMap.get(order.getCustomer()).get(item) + 1);
    }

    private static void addNewCustomerItem(Item item, Map<Item, Integer> itemIntegerMap) {
        itemIntegerMap.put(item, 1);
    }

    private static void addNewCustomer(Map<Customer, Map<Item, Integer>> customersMap, Order order) {
        Map<Item, Integer> temp = new HashMap<>();
        addNewCustomerItem(order.getItems().get(0), temp);
        customersMap.put(order.getCustomer(), temp);
    }
jsonconvertercertstomer jsonconvertercertstomer=newjsonconvertercertstomer(FILENAME3);
List orders=jsonconverterrcustomer.fromJson().orelsetrow();
Map CustomerMap=新建HashMap();
对于(订单:订单){
如果(!customersMap.containsKey(order.getCustomer())){
addNewCustomer(CustomerMap,订单);
}否则{
对于(产品:order.getItems()){
如果(!customersMap.get(order.getCustomer()).containsKey(items)){
addNewCustomerItem(item,customerMap.get(order.getCustomer());
}否则{
updateCustomerItem(CustomerMap、order、item);
}
}
}
}
私有静态void updateCustomerProduct(映射CustomerMap、订单、项目){
customerMap.get(order.getCustomer())
.更换(第,
customerMap.get(order.getCustomer()).get(item),
get(order.getCustomer()).get(item)+1);
}
私有静态void addNewCustomerItem(项项、映射项整数映射){
itemIntegerMap.put(第1项);
}
私有静态void addNewCustomer(映射CustomerMap,订单){
Map temp=newhashmap();
addNewCustomerItem(order.getItems().get(0),temp);
customerMap.put(order.getCustomer(),temp);
}
Order类是一个帮助我从JSON接收数据的类 这是一个简单的类,Customer作为字段,List作为字段。 正如你们所看到的,我正在接收订单列表,并从中创建这个地图。
我能让它更实用吗?使用流?我试着去做,但不知道怎么做/

正如Jason所指出的,有两种可能的方法使其更易于维护/可读,同时简化执行的逻辑

  • 首先,您可以去掉管道中的一个阶段,并将
    map
    reduce
    合并到单个管道中
  • 另一种方法是提取每个客户支付的总金额
因此,抽象将如下所示,并为您的输入处理内部映射:

private BigDecimal totalPurchaseByCustomer(Map<Item, Integer> customerOrders) {
    return customerOrders.entrySet()
            .stream()
            .map(o -> o.getKey().getPrice().multiply(BigDecimal.valueOf(o.getValue())))
            .reduce(BigDecimal.ZERO, BigDecimal::add);
}

正如Jason所指出的,有两种可能的方法可以使它更易于维护/可读,同时简化执行的逻辑

  • 首先,您可以去掉管道中的一个阶段,并将
    map
    reduce
    合并到单个管道中
  • 另一种方法是提取每个客户支付的总金额
因此,抽象将如下所示,并为您的输入处理内部映射:

private BigDecimal totalPurchaseByCustomer(Map<Item, Integer> customerOrders) {
    return customerOrders.entrySet()
            .stream()
            .map(o -> o.getKey().getPrice().multiply(BigDecimal.valueOf(o.getValue())))
            .reduce(BigDecimal.ZERO, BigDecimal::add);
}

发布你已经尝试过的代码。这不是那么简单,因为我尝试过几次删除它尝试不同的方法,并且在过程中总会有一些我无法克服的地方。如果你不付出一些努力,我怀疑是否有人会帮助你。这样做的方法是,首先你自己解决问题,如果你没有成功,你发布你的代码和你被卡住的地方的描述。我理解这位朋友,但我浪费了很多时间,因为它没有弄明白,所以我在这里尝试,因为我没有想法,我只是被卡住了。我几乎确定我应该使用entrySet和form,尝试收集一些数据,但每次我碰壁时/我甚至不需要一个纯粹的解决方案,只要举例说明如何处理它,从嵌套的地图中获取一些数据。然后我会试着自己解决一些问题,我只是不想再花一个小时在上面,没有任何结果。发布你已经尝试过的代码。这并不简单,因为我尝试过几次删除它,尝试不同的方法,但在过程中的某个地方总是有一些我无法克服的问题。我怀疑是否有人会帮助你没有你的努力。这样做的方法是,首先你自己解决问题,如果你没有成功,你发布你的代码和你被卡住的地方的描述。我理解这位朋友,但我浪费了很多时间,因为它没有弄明白,所以我在这里尝试,因为我没有想法,我只是被卡住了。我几乎确定我应该使用entrySet和form,尝试收集一些数据,但每次我碰壁时/我甚至不需要一个纯粹的解决方案,只要举例说明如何处理它,从嵌套的地图中获取一些数据。然后我会试着自己解决一些问题,我只是不想再花一个小时在上面,没有任何结果。@Tausa这可能值得一个新问题,一定要确保在发布之前自己尝试一下。:)仅从概述中,您可以使用收集器toMap创建
Map
,但它可能需要一个
flatMap
ping作为中间操作。@Tausa它可能值得一个新问题,并确保在发布之前您自己尝试一些东西。:)仅从概述中,您可以使用收集器toMap创建
Map
,但它可能需要一个
flatMap
ping作为中间操作。
private Customer maxPayingCustomer(Map<Customer, Map<Item, Integer>> customersMap) {
    Map<Customer, BigDecimal> customerPayments = customersMap.entrySet()
            .stream()
            .collect(Collectors.toMap(Map.Entry::getKey,
                    e -> totalPurchaseByCustomer(e.getValue())));
    return customerPayments.entrySet()
            .stream()
            .max(Map.Entry.comparingByValue())
            .map(Map.Entry::getKey)
            .orElseThrow();
}