change
-------------------------------------------------
package sample;
import static java.math.BigDecimal.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import sample.dto.ActDto;
import sample.dto.EstDto;
import sample.dto.GroupActEstDto;
import sample.dto.GroupDto;
public class Keisan {
public static void main(String[] args) {
List<GroupDto> grpList = new ArrayList<GroupDto>();
grpList.add(new GroupDto("000", "name000"));
grpList.add(new GroupDto("1**", "name1**"));
grpList.add(new GroupDto("11*", "name11*"));
grpList.add(new GroupDto("110", "name110"));
grpList.add(new GroupDto("111", "name111"));
grpList.add(new GroupDto("112", "name112"));
grpList.add(new GroupDto("12*", "name12*"));
grpList.add(new GroupDto("120", "name120"));
grpList.add(new GroupDto("121", "name121"));
grpList.add(new GroupDto("13*", "name13*"));
grpList.add(new GroupDto("130", "name130"));
grpList.add(new GroupDto("141"));
grpList.add(new GroupDto("142"));
grpList.add(new GroupDto("152"));
grpList.add(new GroupDto("153"));
grpList.add(new GroupDto("160"));
grpList.add(new GroupDto("255"));
grpList.add(new GroupDto("260"));
grpList.add(new GroupDto("310"));
List<ActDto> actList = new ArrayList<ActDto>();
actList.add(new ActDto("110", 1000.0050));
actList.add(new ActDto("111", 1200));
actList.add(new ActDto("120", 1300));
actList.add(new ActDto("130", 1400));
actList.add(new ActDto("141", 1500));
actList.add(new ActDto("152", 1600));
actList.add(new ActDto("153", 1700));
actList.add(new ActDto("255", 1800));
List<EstDto> estList = new ArrayList<EstDto>();
estList.add(new EstDto("110", 2000));
estList.add(new EstDto("112", 2100));
estList.add(new EstDto("121", 2200));
estList.add(new EstDto("122", 2300));
estList.add(new EstDto("142", 2400));
estList.add(new EstDto("160", 2500));
estList.add(new EstDto("260", 2600));
estList.add(new EstDto("310", 2700));
estList.add(new EstDto("OPT1", 1111));
estList.add(new EstDto("OPT2", 2222));
// グループマスタをMapに移動
Map<String, GroupActEstDto> resultMap = convGroupListToMap(grpList);
// 実績をMapに移動
moveActListToMap(actList, resultMap);
// 見積をMapに移動
moveEstListToMap(estList, resultMap);
// サマリに金額加算
for (GroupActEstDto result : resultMap.values()) {
if (result.isSummaryGroup() || result.isSummaryUnnecessaryGroup()) {
// サマリグループかサマリ不要グループなら加算対象外
continue;
}
// サマリ(N**)に金額を追加
addKingaku(result.getSummaryGroup2(), resultMap, result);
// サマリ(NN*)に金額を追加
addKingaku(result.getSummaryGroup3(), resultMap, result);
}
List<GroupActEstDto> results = new ArrayList<>(resultMap.values());
Collections.sort(results); // 並び替え
results.add(getTotalDto(results)); // 合計情報追加
for (GroupActEstDto result : results) {
System.out.println(result);
}
}
/**
* グループマスタをMapに変換
*/
private static Map<String, GroupActEstDto> convGroupListToMap(List<GroupDto> grpList) {
Map<String, GroupActEstDto> resultMap = new ConcurrentHashMap<>();
for (GroupDto group : grpList) {
GroupActEstDto dto = new GroupActEstDto(group.getGroup());
dto.setGroupName(group.getGroupName());
resultMap.put(group.getGroup(), dto);
}
return resultMap;
}
/**
* 実績をMapに移動
*/
private static void moveActListToMap(List<ActDto> actList, Map<String, GroupActEstDto> resultMap) {
for (ActDto act : actList) {
GroupActEstDto dto = resultMap.get(act.getGroup());
if (dto == null) { // エントリなければ作成
dto = new GroupActEstDto(act.getGroup());
resultMap.put(act.getGroup(), dto);
}
dto.setActKingaku(act.getActKingaku());
}
}
/**
* 見積をMapに移動
*/
private static void moveEstListToMap(List<EstDto> estList, Map<String, GroupActEstDto> resultMap) {
for (EstDto est : estList) {
GroupActEstDto dto = resultMap.get(est.getGroup());
if (dto == null) { // エントリなければ作成
dto = new GroupActEstDto(est.getGroup());
resultMap.put(est.getGroup(), dto);
}
dto.setEstKingaku(est.getEstKingaku());
}
}
/**
* サマリグループに金額を加算
*/
private static void addKingaku(String summaryGroup, Map<String, GroupActEstDto> resultMap, GroupActEstDto result) {
GroupActEstDto dto = resultMap.get(summaryGroup);
if (dto == null) { // サマリグループなければMapに新規追加
dto = new GroupActEstDto(summaryGroup);
resultMap.put(summaryGroup, dto);
}
dto.addActKingaku(result.getActKingaku()); // 金額加算
dto.addEstKingaku(result.getEstKingaku());
}
/**
* 合計情報を取得
*/
private static GroupActEstDto getTotalDto(List<GroupActEstDto> results) {
BigDecimal totalActKingaku = ZERO;
BigDecimal totalEstKingaku = ZERO;
for (GroupActEstDto result : results) {
if (!result.isSummaryGroup()) {
totalActKingaku = totalActKingaku.add(result.getActKingaku() == null ? ZERO : result.getActKingaku());
totalEstKingaku = totalEstKingaku.add(result.getEstKingaku() == null ? ZERO : result.getEstKingaku());
}
}
GroupActEstDto total = new GroupActEstDto();
total.setActKingaku(totalActKingaku);
total.setEstKingaku(totalEstKingaku);
return total;
}
}
-------------------------------------------------