发货单对象的属性有编号、客户、品种、重量、数量
IList<FaHuoDan> list = new List<FaHuoDan>();
FaHuoDan a1 = new FaHuoDan("FHD001", "客户1", "品种1", 1000, 1);       (1)
list.add(a1);
a1 = new FaHuoDan("FHD001", "客户1", "品种1", 2000, 2);                 (2)
list.add(a1);
a1 = new FaHuoDan("FHD001", "客户1", "品种2", 3000, 3);                 (3)
list.add(a1);
a1 = new FaHuoDan("FHD001", "客户1", "品种3", 4000, 4);                  (4)
list.add(a1);
a1 = new FaHuoDan("FHD001", "客户2", "品种1", 5000, 4);                  (5)
list.add(a1);
a1 = new FaHuoDan("FHD001", "客户2", "品种1", 6000, 5);                  (6)
list.add(a1);
a1 = new FaHuoDan("FHD001", "客户2", "品种2", 7000, 6);                  (7)
list.add(a1);
a1 = new FaHuoDan("FHD002", "客户3", "品种2", 8000, 1);                  (8)
list.add(a1);
a1 = new FaHuoDan("FHD002", "客户4", "品种2", 9000, 2);                  (9)
list.add(a1);
a1 = new FaHuoDan("FHD002", "客户3", "品种2", 1000, 3);                  (10)
list.add(a1);   
a1 = new FaHuoDan("FHD001", "客户1", "品种1", 2000, 4);                  (11)
list.add(a1);
a1 = new FaHuoDan("FHD001", "客户2", "品种2", 2000, 5);                  (12)
list.add(a1);各个发货单没有排好序。
按发货单编号分组,再按客户分组,再按品种分组,对重量和数量的统计,上个例子,我需要的结果如下
FHD001, 客户1,品种1, 100+200+200=500,1+2+4=7      (1)+(2)+(11)
FHD001, 客户1,品种2, 1300,3                       (3)
FHD001, 客户1,品种3, 400,4                        (4)
FHD001, 客户2,品种1, 500+600=1100,4+5=9           (5)+(6)
FHD001, 客户2,品种2, 700+200=900,6+5=11           (7)+(12)
FHD002, 客户3,品种2, 800+100=900,1+3=4            (8)+(10)
FHD002, 客户4,品种2, 900,2                        (9)
求解好的算法,最好的有代码

解决方案 »

  1.   

    LINGQ应该可以,不过SQL中很方便SELECT 编号,客户,品种,SUM(重量),SUM(数量) FROM TB GROUP BY 编号,客户,品种
      

  2.   

    转成DAtaSEt 用DEFault的Select方法取!
      

  3.   

    用Sql当然简单。现在,我的要求是用代码写。转成dataset,是一条思路,但不知怎么实现
      

  4.   

    public class CountVoOrder { 
    public static void main(String args[]) { 
    ist<VoOrder> orderList = new ArrayList<VoOrder>(); 
    orderList.add(new VoOrder("CASH", "0000ITME", 100.00, "C")); 
    orderList.add(new VoOrder("CASH", "0000ITME", 1000.00, "C")); 
    orderList.add(new VoOrder("CASHD", "11111ITME", 100.00, "C"));
    orderList.add(new VoOrder("CASH", "0000ITME", 900.00, "C"));
    orderList.add(new VoOrder("ADVICE", "2222ITEM", 100.00, "C"));
    orderList.add(new VoOrder("CASH", "0000ITEM", 900.00, "C")); 
    Map<String, VoOrder> orderMap = new HashMap<String, VoOrder>(); 
    for(VoOrder order: orderList){ 
    if(order != null && order.getAcctcode() != null){
    if (orderMap.get(order.getAcctcode()) == null){ 
    orderMap.put(order.getAcctcode(), order); 
    }
    else{ 
    orderMap.get(order.getAcctcode()).setAmt(orderMap.get(order.getAcctcode()).getAmt() + order.getAmt());



     // 其实这样就已经可以循环了:
     // for(String key: orderMap.keySet()){ 
     // VoOrder order = orderMap.get(key); 
     // System.out.println(order.getAcctcode() + "\t\t" + order.getAcctno()+ "\t" + order.getAmt() + "\t\t" + order.getItemtype() ); // } orderList.clear(); orderList.addAll(orderMap.values()); System.out.println("acctcode\tacctno\t\tamt\t\titemType"); for(VoOrder order: orderList){ System.out.println(order.getAcctcode() + "\t\t" + order.getAcctno()+ "\t" + order.getAmt() + "\t\t" + order.getItemtype() ); 
    }

    java中类似的例子,你可参考下