从地图的arraylist获取唯一名称和相应的金额总和

时间:2015-03-25 10:07:16

标签: java

我正在尝试迭代一个arraylist。List<Map<String, Object>> majorList=new ArrayList<Map<String, Object>>();

数据格式将是

  1. {&#34;分类帐&#34;:&#34; A&#34;,&#34; basicAmt&#34;:10,&#34;消费税&#34;:2}, {&#34;分类帐&#34;:&#34; B&#34;,&#34; exciseAmt&#34;:20,&#34; grossAmt&#34;:3},  {&#34;分类帐&#34;:&#34; A&#34;,&#34; basicAmt&#34;:30,&#34;消费税&#34;:5}, {&#34;分类帐&#34;:&#34; C&#34;,&#34; exciseAmt&#34;:50,&#34; grossAmt&#34;:10}, {&#34;分类帐&#34;:&#34; B&#34;,&#34; basicAmt&#34;:40,&#34;消费税&#34;:8},

    所需的结果如下:

    1. {&#34;分类帐&#34;:&#34; A&#34;,&#34; basicAmt&#34;:40,&#34;消费税&#34;:7}, {&#34;分类帐&#34;:&#34; B&#34;,&#34; exciseAmt&#34;:60,&#34; grossAmt&#34;:11}, {&#34;分类帐&#34;:&#34; C&#34;,&#34; basicAmt&#34;:50,&#34;消费税&#34;:10},

2 个答案:

答案 0 :(得分:0)

这将创建地图地图。最高级别的关键是分类帐。辅助地图将为每个“类型”设置一个键。如果类型不存在,则将创建该类型,如果存在,则将其添加到现有条目。最后它最终显示结果。

    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());
        }
    }

答案 1 :(得分:0)

您必须填充新地图,然后根据公共密钥添加值。总结之后得到Map<String, Object>更好,因为所有地图都将用于唯一的分类帐。

    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());
                }
            }
        }
    }