为了账号安全,请及时绑定邮箱和手机立即绑定

仅当不同键下的值匹配时,列表中某些哈希映射值的总和

仅当不同键下的值匹配时,列表中某些哈希映射值的总和

SMILET 2022-09-28 16:37:11
我有一个数组列表,里面装满了数千个哈希图,有四个键和值映射到它们,如下所示:HashMap<String, Object> map = new HashMap<>();map.put("ID", 1);map.put("NAME", name);map.put("WORK_TIME", workTime);map.put("ACCOUNT", name);现在有一个数组列表的那些哈希地图,我想总结一下具有相同ID,名称和帐户的人的工作时间,例如:HashMap<String, Object> map1 = new HashMap<>();map1.put("ID", 1);map1.put("NAME", "Edward");map1.put("WORK_TIME", 20);map1.put("ACCOUNT", null);HashMap<String, Object> map2 = new HashMap<>();map2.put("ID", 1);map2.put("NAME", "Krzych");map2.put("WORK_TIME", 6);map2.put("ACCOUNT", 123);HashMap<String, Object> map3 = new HashMap<>();map3.put("ID", 1);map3.put("NAME", "Edward");map3.put("WORK_TIME", 13.5);map3.put("ACCOUNT", null);HashMap<String, Object> map4 = new HashMap<>();map4.put("ID", 2);map4.put("NAME", "Grzesiek");map4.put("WORK_TIME", 50);map4.put("ACCOUNT", null);HashMap<String, Object> map5 = new HashMap<>();map5.put("ID", 2);map5.put("NAME", "Edward");map5.put("WORK_TIME", 12);map5.put("ACCOUNT", 123);[..]ArrayList<HashMap<String,Object>> arrList = new ArrayList<>();arrList.put..因此,我应该得到一个包含4个哈希地图的数组列表,其中只有两个具有相同ID和帐户的爱德华哈希地图被合并成一个,工作时间为33.5。我唯一想到的是迭代所有映射,比较这三个值,然后成功地替换存储在第二个数组列表中的哈希图中的工作时间值,我正在Java 8中工作,我想使用流来完成这一点,这可能吗?还是您看到了更好的解决方案?
查看完整描述

1 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

这个λ:

Map<String, List<HashMap<String, Object>>> xxx = arrList.stream().collect(Collectors.groupingBy(x -> ((int) x.get("ID") + "") + x.get("NAME")));

给出的结果如下:

//img1.sycdn.imooc.com//6334083600019ab603520101.jpg

但是,如上所述 - 您应该使用(如果可能)对象而不是数组。对于对象,lambda 将如下所示:

Map<String, List<Person>> xxx = arrList.stream().collect(Collectors.groupingBy(x -> x.getName() + x. getId()));

但是由于您有 Person 类,因此您可以覆盖等于以满足您的需求,并且可以在一个简单的 lambda 中映射和求和工作时间:

Map<Person, Double> result = arrList.stream().collect(Collectors.groupingBy(x -> x, Collectors.summingDouble(Person::getWorkTime)));

这就是结果 - 将人员地图作为键,将工作时间摘要作为值。

//img1.sycdn.imooc.com//6334084200014b2203590229.jpg

人员类的代码:


public class Person {

        String name;

        int id;

        double workTime;


        public Person(String name, int id, double workTime) {

            this.name = name;

            this.id = id;

            this.workTime = workTime;

        }


        @Override

        public boolean equals(Object o) {

            if (this == o) return true;

            if (o == null || getClass() != o.getClass()) return false;

            Person person = (Person) o;

            return id == person.id &&

                    Objects.equals(name, person.name);

        }


        @Override

        public int hashCode() {


            return Objects.hash(name, id);

        }

    }

示例代码:


Person person1 = new Person("Edward", 1, 20);

Person person2 = new Person("Krzych", 1, 6);

Person person3 = new Person("Edward", 1, 13.5);

Person person4 = new Person("Grzesiek", 2, 50);

Person person5 = new Person("Edward", 2, 12);


ArrayList<Person> arrList = new ArrayList<>();


arrList.add(person1);

arrList.add(person2);

arrList.add(person3);

arrList.add(person4);

arrList.add(person5);


Map<Person, Double> result = arrList.stream().collect(Collectors.groupingBy(x -> x, Collectors.summingDouble(Person::getWorkTime)));



查看完整回答
反对 回复 2022-09-28
  • 1 回答
  • 0 关注
  • 62 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信