java: List<Map<String, Object>>相同key去合计value
业务场景:
分摊明细需要根据收支项目(key)去取合计, 并与表体明细相同的收支项目合计金额进行校验
代码
// 获取表体与分摊页签vo
CShareDetailVO[] csharevo = jkbxvo.getcShareDetailVo();
BXBusItemVO[] bvo = jkbxvo.getBxBusItemVOS();
// 调用getmap方法
Map<String,UFDouble> CsharevoMap = getmap(csharevo,"cshare");
Map<String,UFDouble> bvoMap = getmap(bvo,"bvo");
IInoutBusiClassQryService Ibusi = NCLocator.getInstance().lookup(IInoutBusiClassQryService.class);
// 处理信息
List<String> list = new ArrayList<String>();
if(CsharevoMap!=null&&CsharevoMap.size()!=0){
for (Map.Entry<String, UFDouble> entry : CsharevoMap.entrySet())
{
String testKey = entry.getKey();
if(CsharevoMap.get(testKey).equals(bvoMap.get(testKey))){
System.out.println(testKey);
}else{
String str = testKey.replaceAll("\\[|\\)", "").replaceAll("\\]|\\)", "");
list.add(str);
}
}
List<String> liststr = new ArrayList<String>();
if(list!=null&&list.size()!=0){
for(int i = 0 ; i <list.size();i++){
InoutBusiClassVO busivo = Ibusi.queryInoutBusiClassVOByPk(list.get(i));
String name = busivo.getName();
liststr.add(name.toString());
}
throw new LfwRuntimeException(liststr.toString().replaceAll("\\[|\\)", "").replaceAll("\\]|\\)", "")+"分摊明细页签的合计与单据明细页签合计不一致");
}
}
/**
* 将同一key的value相加
* @param obj
* @param type
* @return
*/
public Map<String,UFDouble> getmap(Object[] obj,String type){
List<Map<String,UFDouble>> list = new ArrayList<Map<String,UFDouble>>();
Map<String,UFDouble> mapend = new HashMap<String,UFDouble>();
Set<String> strlist = new HashSet<String>();
if(obj!=null&&obj.length!=0){
for(int i = 0 ; i <obj.length;i++){
if("cshare".equals(type)){
CShareDetailVO[] csharevo = (CShareDetailVO[]) obj;
Map<String,UFDouble> mapc = new HashMap<String,UFDouble>();
mapc.put(csharevo[i].getPk_iobsclass(), csharevo[i].getAssume_amount());
list.add(mapc);
strlist.add(csharevo[i].getPk_iobsclass());
}else {
BXBusItemVO[] bvo = (BXBusItemVO[]) obj;
Map<String,UFDouble> mapb= new HashMap<String,UFDouble>();
mapb.put(bvo[i].getSzxmid(), bvo[i].getTni_amount());
list.add(mapb);
strlist.add(bvo[i].getSzxmid());
}
}
// 最关键的一步,获取List中所有的MAP的key,将相同key的value进行合计处理
mapend = getAmount(list,strlist.toArray(new String[strlist.size()]));
}
return mapend;
}
/**
*
* @param selectList
* @param key
* @return 合计后的MAP
*/
public static Map<String,UFDouble> getAmount(List ListMap, String[] key) {
Map<String,UFDouble> param = new HashMap<String,UFDouble>();
UFDouble sum = UFDouble.ZERO_DBL;
if (ListMap!=null) {
if (ListMap.size() > 0) {
for (int i=0; i<key.length; i++) {
String str = key[i];
param.put(str,UFDouble.ZERO_DBL);
}
Iterator<Map<String, UFDouble>> list = ListMap.iterator();
while(list.hasNext()) {
Map<String,UFDouble> map = (Map<String,UFDouble>)list.next();
for (int i=0; i<key.length; i++) {
String strin = key[i];
sum = param.get(strin);
Object obj = map.get(strin);
if (obj != null) {
sum = sum.add((UFDouble) map.get(strin));
}
param.put(strin, sum);
}
}
}
}
return param;
}
转载于:https://blog.csdn.net/qq_37110695/article/details/88992300