您的位置:首页 > 编程语言

代码关于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;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: