亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

僅當不同鍵下的值匹配時,列表中某些哈希映射值的總和

僅當不同鍵下的值匹配時,列表中某些哈希映射值的總和

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")));

給出的結果如下:

http://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)));

這就是結果 - 將人員地圖作為鍵,將工作時間摘要作為值。

http://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 關注
  • 87 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號