Java 从地图的arraylist中获取唯一名称和相应的金额总和
我正在尝试迭代arraylist。Java 从地图的arraylist中获取唯一名称和相应的金额总和,java,Java,我正在尝试迭代arraylist。List majorList=new arraylist() 数据格式将是 {“分类账”:“A”,“基本收入”:10,“消费税”:2}, {“分类账”:“B”,“消费税金额”:20,“总收入”:3}, {“分类账”:“A”,“基本收入”:30,“消费税”:5}, {“分类账”:“C”,“消费税金额”:50,“总收入”:10}, {“分类账”:“B”,“基本收入”:40,“消费税”:8} 所需的结果如下: {“分类账”:“A”,“基本收入”:40,“消费税”:7}
List majorList=new arraylist()代码>
数据格式将是
{“分类账”:“A”,“基本收入”:10,“消费税”:2},
{“分类账”:“B”,“消费税金额”:20,“总收入”:3},
{“分类账”:“A”,“基本收入”:30,“消费税”:5},
{“分类账”:“C”,“消费税金额”:50,“总收入”:10},
{“分类账”:“B”,“基本收入”:40,“消费税”:8}
所需的结果如下:
{“分类账”:“A”,“基本收入”:40,“消费税”:7},
{“分类账”:“B”,“消费税金额”:60,“总收入”:11},
{“分类账”:“C”,“基本收入”:50,“消费税”:10}
这将创建一个地图地图。顶层的关键是分类账。次级映射将为每个“类型”设置一个键。如果类型不存在,则将创建该类型;如果存在,则将其添加到现有条目中。它最终会在最后显示结果
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());
}
}
List majorList=new ArrayList();
//设置
Map Map=newhashmap();
地图放置(“分类账”、“A”);
地图放置(“basicAmt”,10);
map.put(“消费税”,2);
majorList.add(地图);
map=新的HashMap();
地图放置(“分类账”、“B”);
地图.put("amt",20);;
地图放置(“grossAmt”,3);
majorList.add(地图);
map=新的HashMap();
地图放置(“分类账”、“A”);
地图放置(“basicAmt”,30);
地图出售(“消费税”,5);
majorList.add(地图);
map=新的HashMap();
地图放置(“分类账”、“C”);
地图放置(“消费税”,50);
地图放置(“grossAmt”,第10页);
majorList.add(地图);
map=新的HashMap();
地图放置(“分类账”、“B”);
地图放置(“basicAmt”,40);
地图出售(“消费税”,8);
majorList.add(地图);
Map账本=新建HashMap();
//遍历列表
用于(地图m:majorList){
//获取结果映射并创建(如果不存在)
字符串分类账=(字符串)m.get(“分类账”);
Map-ledgerMap=ledgers.get(分类账);
如果(ledgerMap==null){
ledgerMap=新的HashMap();
分类账。放置(分类账,分类账映射);
}
//在映射中迭代其他键
对于(条目:m.entrySet()){
String key=entry.getKey();
//忽略分类帐键
如果(!key.equals(“分类账”)){
//添加结果
整数值=(整数)项。getValue();
整数existing=(整数)ledgerMap.get(键);
if(现有==null){
账本映射放置(键、值);
}否则{
账本映射放置(键,现有+值);
}
}
}
}
//显示结果
对于(条目:ledgers.entrySet()){
System.out.println(“分类账:+entry.getKey());
对于(Entry-ledgerEntry:Entry.getValue()
.entrySet()){
System.out.println(“+ledgerEntry.getKey()+”:”
+ledgerEntry.getValue());
}
}
您必须填充一个新映射,然后根据公共键添加值。求和后最好有一张地图
,因为所有地图都是唯一的分类账
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());
}
}
}
}
Map sumMap=newhashmap();
用于(地图abc:majorList){
Map temp=sumMap.get((字符串)abc.get(“分类账”);
if(temp==null){
sumMap.put((字符串)abc.get(“分类账”),abc);
}否则{
for(条目:abc.entrySet()){
如果(!entry.getKey().equals(“分类账”)){
临时输入(entry.getKey(),
(整数)temp.get(entry.getKey())
+(整数)entry.getValue());
}
}
}
}
分类账是你地图的关键吗?很高兴其他人似乎理解了你的问题-我真的很困惑你的实际问题是什么。@underdog:是的分类账是关键。你的单键映射了多个值。。。。你能详细说明对象是什么数据结构吗?你的问题不清楚。请解释您的问题。使用此代码,我将获得所有消费税金额,但我需要根据不同分类账获得消费税总额和毛额总额。正如我在我的问题中所展示的,这不是你的问题。您想将其更新为您想要的吗?是的,我想迭代并在不同的列表中添加唯一的分类账名称和金额总和。