首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从地图数组中获得唯一的名称和相应的金额和金额

从地图数组中获得唯一的名称和相应的金额和金额
EN

Stack Overflow用户
提问于 2015-03-25 10:07:16
回答 2查看 366关注 0票数 1

我正在尝试迭代一个数组列表.List<Map<String, Object>> majorList=new ArrayList<Map<String, Object>>();

数据格式将是

  1. {“分类账”:"A“、"basicAmt":10、”消费税“:2}、{”分类账“:"B”、"exciseAmt":20、"grossAmt":3}、{“分类账”:"A“、"basicAmt":30、”消费税“:5}、{”分类账“:"C”、"exciseAmt":50、"grossAmt":10}、{“分类账”:"B“、"basicAmt":40、”消费税“:8}, 所需的结果如下:
代码语言:javascript
复制
1. {"ledger": "A","basicAmt": 40,"excise": 7}, {"ledger": "B","exciseAmt": 60,"grossAmt": 11}, {"ledger": "C","basicAmt": 50,"excise": 10},

EN

回答 2

Stack Overflow用户

发布于 2015-03-25 10:10:58

这将创建一张地图。最高层的关键是分类账。二级地图将为每种“类型”都有一个键。如果类型不存在,则将创建该类型;如果存在,则会将其添加到现有条目中。最后将结果显示在最后。

代码语言:javascript
复制
    List<Map<String, Object>> majorList = new ArrayList<Map<String, Object>>();

    // setup
    Map<String, Object> map = new HashMap<>();
    map.put("ledger", "A");
    map.put("basicAmt", 10);
    map.put("excise", 2);
    majorList.add(map);

    map = new HashMap<>();
    map.put("ledger", "B");
    map.put("exciseAmt", 20);
    map.put("grossAmt", 3);
    majorList.add(map);

    map = new HashMap<>();
    map.put("ledger", "A");
    map.put("basicAmt", 30);
    map.put("excise", 5);
    majorList.add(map);

    map = new HashMap<>();
    map.put("ledger", "C");
    map.put("exciseAmt", 50);
    map.put("grossAmt", 10);
    majorList.add(map);

    map = new HashMap<>();
    map.put("ledger", "B");
    map.put("basicAmt", 40);
    map.put("excise", 8);
    majorList.add(map);

    Map<String, Map<String, Object>> ledgers = new HashMap<>();

    // iterate through list
    for (Map<String, Object> m : majorList) {

        // get result map and create if does not exist
        String ledger = (String) m.get("ledger");
        Map<String, Object> ledgerMap = ledgers.get(ledger);
        if (ledgerMap == null) {
            ledgerMap = new HashMap<>();
            ledgers.put(ledger, ledgerMap);
        }

        // iterate through map for other keys
        for (Entry<String, Object> entry : m.entrySet()) {
            String key = entry.getKey();
            // ignore ledger key
            if (!key.equals("ledger")) {
                // Add results
                Integer value = (Integer) entry.getValue();
                Integer existing = (Integer) ledgerMap.get(key);
                if (existing == null) {
                    ledgerMap.put(key, value);
                } else {
                    ledgerMap.put(key, existing + value);
                }
            }
        }
    }

    // display results
    for (Entry<String, Map<String, Object>> entry : ledgers.entrySet()) {
        System.out.println("Ledger: " + entry.getKey());
        for (Entry<String, Object> ledgerEntry : entry.getValue()
                .entrySet()) {
            System.out.println("  " + ledgerEntry.getKey() + ": "
                    + ledgerEntry.getValue());
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2015-03-25 10:35:14

您必须填充一个新的Map,然后根据公共键添加值。经过总结,它更好的有一个Map<String, Object>,因为所有的地图将是为独特的分类账。

代码语言:javascript
复制
    Map<String, Map<String, Object>> sumMap = new HashMap<String, Map<String,Object>>();
    for (Map<String, Object> abc : majorList) {
        Map temp = sumMap.get((String) abc.get("ledger"));
        if (temp == null) {
            sumMap.put((String) abc.get("ledger"), abc);
        } else {
            for (Entry<String, Object> entry : abc.entrySet()) {
                if (!entry.getKey().equals("ledger")) {
                    temp.put(entry.getKey(),
                            (Integer) temp.get(entry.getKey())
                                    + (Integer) entry.getValue());
                }
            }
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29252678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档