以“求各个港口的 船、航次的 个数 ”为例,最终实现的结果集如下:
代码实现,如下:
if(!rsList3.isEmpty() && rsList3.size()>0) {
int total_vessel_num = 0;//总计 船条数
int total_voyage_num = 0;//总计 航次数
List<IRow> resultList3 = new ArrayList<IRow>();//最终结果集
//按港口分组
String PORT_CD_KEY = "PORT_CD";
LinkedHashSet<String> setTmp =new LinkedHashSet<String>();
for (IRow irow : rsList3) {
setTmp.add(irow.getValue(PORT_CD_KEY));//按原list的顺序 去重
}
for (String temp : setTmp) {
int portNum = 0;//港口的个数
String PORT_CD_VAL = "";
Map<String, String> repeatMap = new HashMap<String, String>();
//按港口分组的单个港口的List
List<IRow> portList = new ArrayList<IRow>();
for (int i = 0; i < rsList3.size(); i++) {
IRow irow = rsList3.get(i);
PORT_CD_VAL = irow.getValue(PORT_CD_KEY);
if (temp.equals(PORT_CD_VAL)) {
if(!repeatMap.containsValue(PORT_CD_VAL)) {
portNum += 1;
}
repeatMap.put(PORT_CD_KEY, PORT_CD_VAL);
portList.add(irow);
}
}
String vessel_cd_key ="VESSEL_CD";
Set<Object> vessel_cd_val = new HashSet<Object>();
String voyage_key ="VOYAGE";
Set<Object> voyage_val = new HashSet<Object>();
for (IRow tmp : portList) {
//把单个港口的list 再按 船、航次分组,去重
vessel_cd_val.add(tmp.getValue(vessel_cd_key));
voyage_val.add(tmp.getValue(voyage_key));
}
//船小计
int vesselNum = vessel_cd_val.size();
total_vessel_num += vesselNum;
//航次小计
int voyageNum = voyage_val.size();
total_voyage_num += voyageNum;
IRow xjRow = new Row();
xjRow.setValue("PORT_CD", temp+"小计");
xjRow.setValue("VESSEL_CD", String.valueOf(vesselNum));
xjRow.setValue("VOYAGE", String.valueOf(voyageNum));
portList.add(xjRow);
for (IRow iRow : portList) {
resultList3.add(iRow);
}
}
IRow totalRow = new Row();
totalRow.setValue("PORT_CD", "总计");
totalRow.setValue("VESSEL_CD", String.valueOf(total_vessel_num));
totalRow.setValue("VOYAGE", String.valueOf(total_voyage_num));
resultList3.add(totalRow);
System.out.println(resultList3);
}
备注:
1.Set集合:
插入无序,不可指定位置访问,数据不可重复。
迭代器:
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
2.LinkedHashSet
是Set集合的一个实现,具有set集合不重复的特点,同时具有可预测的迭代顺序,也就是我们插入的顺序。
是一个非线程安全的集合。如果有多个线程同时访问当前linkedhashset集合容器,并且有一个线程对当前容器中的元素做了修改,那么必须要在外部实现同步保证数据的冥等性。