代码关于TreeMap Collection
2016-06-02 20:26
309 查看
package com.amarsoft.alpr.acc.calc.fnaci.impl; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import org.joda.time.DateTime; import org.joda.time.Interval; import org.joda.time.Period; import org.joda.time.PeriodType; import org.joda.time.format.DateTimeFormat; import org.junit.Test; import com.amarsoft.alpr.acc.calc.CalcConst; import com.amarsoft.alpr.acc.calc.fnaci.IncomeScheduleItem; import com.amarsoft.alpr.acc.calc.fnaci.ServiceScheduleItem; import com.amarsoft.alpr.acc.calc.tax.RepaymentScheduleItemWithTax; public class ServiceScheduleCalculateByShareEquallyTest { private String startDate; private String endDate; private int scale = 12; private RoundingMode roundingMode = RoundingMode.HALF_UP; public String getStartDate() { return startDate; } public void setStartDate(String startDate) { this.startDate = startDate; } public int getScale() { return scale; } public void setScale(int scale) { this.scale = scale; } public RoundingMode getRoundingMode() { return roundingMode; } public void setRoundingMode(RoundingMode roundingMode) { this.roundingMode = roundingMode; } private String getNextDate(String date){ DateTime baseDate = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(date); DateTime nextDate = baseDate.plusDays(0); return nextDate.toString(CalcConst.DATE_FORMAT); } public void tes(){ } @Test public void test(){ List<DateRangeIncome> driList = new ArrayList<DateRangeIncome>(); DateRangeIncome dria = new DateRangeIncome(); dria.startDate = "2016/09/09"; dria.endDate = "2016/11/09"; dria.sum = (double) 1000; System.out.println(dria.getDays()); DateRangeIncome dric = new DateRangeIncome(); dric.startDate = "2016/10/09"; dric.endDate = "2016/12/09"; dric.sum = (double) 2000; driList.add(dria); driList.add(dric); Map<Object,BigDecimal> mal = new TreeMap<Object,BigDecimal>(); Map<Object, BigDecimal> resultMap = null; for(DateRangeIncome dri:driList){ resultMap = calculatec(mal,dri); /*for(ServiceScheduleItem ss:list){ System.out.println(ss.getAccrueDate()+"----++++++"+ss.getAccrueSum()); }*/ } Object[] objArra = resultMap.keySet().toArray(); int v = 0; for(Object o : resultMap.keySet()){ System.out.println(objArra[v]+"+++++++++++"+resultMap.get(o)+"]]]]]]]]]]]]]]]]]]"); v++; } return; //成功 /*Map<Object,Double> mal = new TreeMap<Object,Double>(); List<ServiceScheduleItem> sSItemList = new ArrayList<ServiceScheduleItem>(); for(int i=0;i<driList.size();i++){ List<ServiceScheduleItem> sList = calculate(driList.get(i)); //System.out.println(calculate(driList.get(i)).size()+"---------------"); for(int j=0;j<sList.size();j++){ sSItemList.add(sList.get(j)); if(mal.get(sList.get(j).getAccrueDate())!=null){ double sum = mal.get(sList.get(j).getAccrueDate())+sList.get(j).getAccrueSum(); System.out.println(sum+"----------------"+mal.get(sList.get(j).getAccrueDate())+""+sList.get(j).getAccrueSum()); mal.put(sList.get(j).getAccrueDate(), sum); }else{ mal.put(sList.get(j).getAccrueDate(), sList.get(j).getAccrueSum()); } } //System.out.println(servSchList.get(j).getAccrueMonth()+"++++++++++"+servSchList.get(j).getAccrueSum()); } Object[] objArra = mal.keySet().toArray(); int i = 0; for(Object o : mal.keySet()){ System.out.println(objArra[i]+"+++++++++++"+mal.get(o)+"]]]]]]]]]]]]]]]]]]"); i++; } */ //成功 //System.out.println(sSItemList.toString()); /*Set<ServiceScheduleItem> setSSI = new LinkedHashSet<ServiceScheduleItem>(); int flag=0; for(int x=0; x<sSItemList.size();x++){ //System.out.println(sSItemList.size()+"-----------"); ServiceScheduleItem item = sSItemList.get(x); for(int y=x; y<sSItemList.size();y++){ //System.out.println(sSItemList.size()+"++++++++"); if(item.equals(sSItemList.get(y))&&x!=y){ ServiceScheduleItem ssItem1 = new ServiceScheduleItem(); ssItem1.setAccrueDate(sSItemList.get(y).getAccrueDate()); double sum = item.getAccrueSum()+sSItemList.get(y).getAccrueSum(); ssItem1.setAccrueSum(sum); System.out.println("(((((((((("+item.getAccrueSum()+sSItemList.get(y).getAccrueSum()+"))))))"+sum); setSSI.add(ssItem1); //System.out.println(ssItem.getAccrueSum()); //System.out.println(y); flag=1; //continue; } if(flag==1) continue; //System.out.println(item.getAccrueSum()); ServiceScheduleItem ssItem = new ServiceScheduleItem(); ssItem.setAccrueDate(item.getAccrueDate()); ssItem.setAccrueSum(item.getAccrueSum()); setSSI.add(ssItem); } }*/ //System.out.println("///////////"+setSSI.toString()+"\\\\\\\\\\\\\\"); /*for (ServiceScheduleItem service : setSSI) { System.out.println(service.getAccrueDate()+"-"+service.getAccrueSum()); } */ } public Map<Object, BigDecimal> calculatec(Map<Object, BigDecimal> mal,DateRangeIncome dri) { List<ServiceScheduleItem> incomeSchduList = new ArrayList<ServiceScheduleItem>(); DateTime monthEndDate = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(dri.startDate).dayOfMonth().withMaximumValue(); DateTime maxDate = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(dri.endDate).dayOfMonth().withMaximumValue(); DateTime incomeDate = monthEndDate; while(maxDate.isAfter(incomeDate)||maxDate.isEqual(incomeDate)){ ServiceScheduleItem icsi = new ServiceScheduleItem(); icsi.setAccrueDate(incomeDate.toString(CalcConst.DATE_FORMAT)); icsi.setTimes(incomeSchduList.size()+1); incomeSchduList.add(icsi); incomeDate = incomeDate.plusMonths(1).dayOfMonth().withMaximumValue();//增加一个月 } DateTime finshDate = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(dri.endDate); DateTime incomePreStartDate = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(dri.startDate); for(int i=0;i<incomeSchduList.size();i++){ DateTime curEndDate = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(incomeSchduList.get(i).getAccrueDate()); //最后一天为收息日,当天不记息 while((curEndDate.isAfter(incomePreStartDate)||curEndDate.equals(incomePreStartDate))&&!incomePreStartDate.equals(finshDate)){ DateRangeIncome dri1 = dri; BigDecimal dayIncome = dri1.getEverdayIncome(); if(mal.get(incomePreStartDate)!=null){ dayIncome = mal.get(incomePreStartDate).add(dayIncome); mal.put(incomePreStartDate, dayIncome); }else{ mal.put(incomePreStartDate, dayIncome); } incomePreStartDate = incomePreStartDate.plusDays(1);//向后累加一天 } } return mal; } public List<ServiceScheduleItem> calculate(DateRangeIncome dri) { List<ServiceScheduleItem> incomeSchduList = new ArrayList<ServiceScheduleItem>(); //if(driList.size()==0)throw new RuntimeException("argument List<RepaymentScheduleItemWithTax> is empty"); /*2.拆解出计提日期(从开始时间到结束时间的所有月数) * 根据上一步日期可得到收入时间点: * 2015/09/15,2015/09/30,2015/10/31,2015/11/30,2015/12/31,2016/01/31,.....2016/08/31,2016/09/30 */ DateTime monthEndDate = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(dri.startDate).dayOfMonth().withMaximumValue(); DateTime maxDate = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(dri.endDate).dayOfMonth().withMaximumValue(); DateTime incomeDate = monthEndDate; while(maxDate.isAfter(incomeDate)||maxDate.isEqual(incomeDate)){ ServiceScheduleItem icsi = new ServiceScheduleItem(); icsi.setAccrueDate(incomeDate.toString(CalcConst.DATE_FORMAT)); icsi.setTimes(incomeSchduList.size()+1); incomeSchduList.add(icsi); incomeDate = incomeDate.plusMonths(1).dayOfMonth().withMaximumValue();//增加一个月 //System.out.println(icsi.getAccrueMonth()+"-"+icsi.getAccrueDate()); } /*3.计算收入 * 1)根据第2步的日期,相邻两个日期计算出一个时间序列(具体到每一天) * 2)遍历时间序列,根据每一天座落的在第1部的区间,取到每一天的收入 * 3)把这些时间序列中每一天的收入加总,得到每月的收入 */ DateTime finshDate = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(dri.endDate); DateTime incomePreStartDate = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT aabf ).parseDateTime(dri.startDate); for(int i=0;i<incomeSchduList.size();i++){ DateTime curEndDate = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(incomeSchduList.get(i).getAccrueDate()); BigDecimal totalIncome = BigDecimal.ZERO; //最后一天为收息日,当天不记息 while((curEndDate.isAfter(incomePreStartDate)||curEndDate.equals(incomePreStartDate))&&!incomePreStartDate.equals(finshDate)){ DateRangeIncome dri1 = dri; BigDecimal dayIncome = dri1.getEverdayIncome(); totalIncome = totalIncome.add(dayIncome); // System.out.println(String.format("%s 收入 %.4f,累计:%.4f", incomePreStartDate.toString(RepaymentCalculate.DATE_FORMAT),dayIncome.doubleValue(),totalIncome)); incomePreStartDate = incomePreStartDate.plusDays(1);//向后累加一天 } //System.out.println(totalIncome); incomeSchduList.get(i).setAccrueSum(totalIncome.doubleValue()); //System.out.println(incomeSchduList.get(i).getAccrueDate()+"---"+incomeSchduList.get(i).getAccrueSum()); System.out.println(); } //System.out.println(incomeSchduList.toString()); return incomeSchduList; } protected DateRangeIncome searchRange(String date,List<DateRangeIncome> driList){ for(DateRangeIncome i:driList){ if(i.contains(date))return i; } throw new RuntimeException(String.format("date %s is not found in [%s,%s]",date,driList.get(0).startDate,driList.get(driList.size()-1).endDate)); } /** * 日期范围处理,默认算头不算尾的 */ private class DateRangeIncome{ protected String startDate; protected String endDate; protected Double sum; public Integer getDays(){ DateTime date1 = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(startDate); DateTime date2 = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(endDate); Period period = new Period(date1, date2, PeriodType.days()); return period.getDays(); } public boolean contains(String date){ DateTime d = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(date); DateTime date1 = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(startDate); DateTime date2 = DateTimeFormat.forPattern(CalcConst.DATE_FORMAT).parseDateTime(endDate); Interval i = new Interval(date1, date2); return i.contains(d); } /** * 计算每日收入 * @return */ public BigDecimal getEverdayIncome(){ BigDecimal everyDayIncome = BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(getDays()),scale,roundingMode); return everyDayIncome; } } }
相关文章推荐
- Java 的回调机制(同步与异步)
- java基础-----面向对象
- python扩展实现方法--python与c混和编程
- python扩展实现方法--python与c混和编程
- 补课:2014GoogleIO大会发布的 Material Design(中文版)
- 在java web 工程中跳过过滤器
- java基础知识---java语法基础
- 解析java中的hashMap
- myeclipse6.5自动补全
- C++之指向数据成员的指针和指向成员函数的指针
- python扩展实现方法--python与c混和编程
- Java stack 泛型
- C++第七次实验(最大公约和和最小公倍数)
- JDK安装与环境变量配置
- think in java day01
- Python中if __name__ == '__main__'解析
- java学习之路---总结
- Java常见的12大异常和解决办法
- Java基础知识
- C++ and the Perils of Double-Checked Locking