从数据库里面取得的数据一般是以实体的方式返回。但是做报表的话,可能是从实体某个属性来显示,即所谓的行列倒置。所以有人写了行列倒置的SQL,这里也写个java实现的例子。属性是写死的。如果需要灵活点,换成用反射来遍历属性即可。 /** * 将List信息行列倒置 * */ package jdk_1_4.test; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; public class V2HTest { /** * @param args */ public static void main(String[] args) { List dataList = new ArrayList(); setData(dataList,"1"); setData(dataList,"2"); //--按照日期和品牌排序 Collections.sort(dataList, new Comparator() { public int compare(Object o1, Object o2) { DataModel dm1 = (DataModel)o1; DataModel dm2 = (DataModel)o2; int flag = dm1.getDate().compareTo(dm2.getDate()); if(flag == 0) { flag = dm1.getTobaccoName().compareTo(dm2.getTobaccoName()); } return flag; } }); /**/ System.out.println("--------------------行列顺序转换前------------------"); for(int i=0;i<dataList.size();i++) { DataModel dm = (DataModel)dataList.get(i); System.out.println("日期:"+dm.getDate()); System.out.println("卷烟:"+dm.getTobaccoName()); System.out.println(dm.getDate()+"日生产计划:"+dm.getProduceQty()); System.out.println(dm.getDate()+"日销售计划:"+dm.getSaleQty()); System.out.println(dm.getDate()+"日最低库存线:"+dm.getInvLineLow()); System.out.println(dm.getDate()+"日最高库存线:"+dm.getInvLineHigh()); System.out.println(dm.getDate()+"日期末库存:"+dm.getInventoryQty()); System.out.println("----"); } //--行列倒置 Map v2hMap = new LinkedHashMap(); v2hMap = v2h(dataList,6); Object[] tobaccoArr = (Object[])v2hMap.get("Tobacco"); System.out.println("--------------------行列顺序转换后------------------/n"); //System.out.println("-------卷烟品牌"); System.out.print(" "); for(int i=0;i<tobaccoArr.length;i++) { System.out.print(tobaccoArr[i]+" "); } System.out.println(); v2hMap.remove("Tobacco"); /**/ Iterator it = v2hMap.keySet().iterator(); while(it.hasNext()) { String key = it.next().toString(); //System.out.println(key); /**/ LinkedList hList = (LinkedList)v2hMap.get(key); for(int i=0;i<hList.size();i++) { double[] objArr = (double[])hList.get(i); switch(i) { case 0: { System.out.print(key+"日生产计划 "); break; } case 1: { System.out.print(key+"日销售计划 "); break; } case 2: { System.out.print(key+"日最低库存线 "); break; } case 3: { System.out.print(key+"日最高库存线 "); break; } case 4: { System.out.print(key+"日库存 "); break; } } for(int j=0;j<objArr.length;j++) { System.out.print(" "+objArr[j]+" "); } System.out.println(); } System.out.println("=================="); } } //--行列倒置 public static Map v2h(List dataList,int tobaccoCount) { Map v2hMap = new LinkedHashMap(); DataModel dm0 = (DataModel)dataList.get(0); String date = dm0.getDate(); int index = 0; //-- double[] produceQtyArr = new double[tobaccoCount];//当日各品牌生产计划 double[] saleQtyArr = new double[tobaccoCount];//当日各品牌销售计划 double[] invLineHighArr = new double[tobaccoCount];//当日各品牌最高库存 double[] invLineLowArr = new double[tobaccoCount];//当日各品牌最低库存 double[] inventoryQtyArr = new double[tobaccoCount];//当日各品牌最低库存 LinkedList v2hList = new LinkedList(); String[] tobaccoNameArr = new String[tobaccoCount]; //-- for(int i=0;i<dataList.size();i++) { DataModel dm = (DataModel)dataList.get(i); if(!date.equals(dm.getDate())) { v2hList.add(produceQtyArr); v2hList.add(saleQtyArr); v2hList.add(invLineLowArr); v2hList.add(invLineHighArr); v2hList.add(inventoryQtyArr); v2hMap.put(date, v2hList); produceQtyArr = new double[tobaccoCount]; saleQtyArr = new double[tobaccoCount]; invLineHighArr = new double[tobaccoCount]; invLineLowArr = new double[tobaccoCount]; inventoryQtyArr = new double[tobaccoCount]; v2hList = new LinkedList(); date = dm.getDate(); index = 0; } inventoryQtyArr[index] = dm.getInventoryQty(); produceQtyArr[index] = dm.getProduceQty(); saleQtyArr[index] = dm.getSaleQty(); invLineHighArr[index] = dm.getInvLineHigh(); invLineLowArr[index] = dm.getInvLineLow(); tobaccoNameArr[index] = dm.getTobaccoName(); index++; if(i==dataList.size()-1) { v2hList.add(produceQtyArr); v2hList.add(saleQtyArr); v2hList.add(invLineLowArr); v2hList.add(invLineHighArr); v2hList.add(inventoryQtyArr); v2hMap.put(date, v2hList); } } v2hMap.put("Tobacco", tobaccoNameArr);//--卷烟品牌 return v2hMap; } //--计算 public static void setData(List dataList,String date) { DataModel dm1 = new DataModel(); dm1.setDate(date); dm1.setTobaccoName("熊猫"); dm1.setSaleQty(0.0); dm1.setProduceQty(0.0); dm1.setInvLineLow(1.0); dm1.setInvLineHigh(3.0); dm1.setInventoryQty(45.0); DataModel dm2 = new DataModel(); dm2.setDate(date); dm2.setTobaccoName("84软盒中华"); dm2.setSaleQty(0.0); dm2.setProduceQty(0.0); dm2.setInvLineLow(7.5); dm2.setInvLineHigh(20.0); dm2.setInventoryQty(52.0); DataModel dm3 = new DataModel(); dm3.setDate(date); dm3.setTobaccoName("84硬盒中华"); dm3.setSaleQty(0.0); dm3.setProduceQty(0.0); dm3.setInvLineLow(2100.0); dm3.setInvLineHigh(5000.0); dm3.setInventoryQty(1341.0); DataModel dm4 = new DataModel(); dm4.setDate(date); dm4.setTobaccoName("软牡丹(8mg)"); dm4.setSaleQty(0.0); dm4.setProduceQty(0.0); dm4.setInvLineLow(900.0); dm4.setInvLineHigh(2500.0); dm4.setInventoryQty(3565.0); DataModel dm5 = new DataModel(); dm5.setDate(date); dm5.setTobaccoName("硬上海(8mg)"); dm5.setSaleQty(4000.0); dm5.setProduceQty(0.0); dm5.setInvLineLow(3600.0); dm5.setInvLineHigh(8000.0); dm5.setInventoryQty(-1122.0); DataModel dm6 = new DataModel(); dm6.setDate(date); dm6.setTobaccoName("外销牌号A"); dm6.setSaleQty(0.0); dm6.setProduceQty(0.0); dm6.setInvLineLow(0.0); dm6.setInvLineHigh(0.0); dm6.setInventoryQty(10.0); //---------------------- dataList.add(dm1); dataList.add(dm2); dataList.add(dm3); dataList.add(dm4); dataList.add(dm5); dataList.add(dm6); } } class DataModel { private String date; private String tobaccoName; private double inventoryQty;//当日期末库存 private double saleQty;//当日销售计划 private double produceQty;//当日生产数量 private double invLineHigh;//当日最高库存线 private double invLineLow;//当日最低库存线 public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getTobaccoName() { return tobaccoName; } public void setTobaccoName(String tobaccoName) { this.tobaccoName = tobaccoName; } public double getInventoryQty() { return inventoryQty; } public void setInventoryQty(double inventoryQty) { this.inventoryQty = inventoryQty; } public double getSaleQty() { return saleQty; } public void setSaleQty(double saleQty) { this.saleQty = saleQty; } public double getProduceQty() { return produceQty; } public void setProduceQty(double produceQty) { this.produceQty = produceQty; } public double getInvLineHigh() { return invLineHigh; } public void setInvLineHigh(double invLineHigh) { this.invLineHigh = invLineHigh; } public double getInvLineLow() { return invLineLow; } public void setInvLineLow(double invLineLow) { this.invLineLow = invLineLow; } }