关于list内部排序问题?就是那么奇怪呀!!!!
list数据如下:
BillTree aa = new BillTree(); aa.setBillItemTypeID("-100"); aa.setBillParentID("-1"); aa.setPrintOrder("99999"); aa.setBillItemName("移动电话"); list.add(aa); aa = new BillTree(); aa.setBillItemTypeID("1010020"); aa.setBillParentID("-100"); aa.setPrintOrder("20"); aa.setBillItemName("套餐月基本费"); list.add(aa); aa = new BillTree(); aa.setBillItemTypeID("1010015"); aa.setBillParentID("1001021"); aa.setPrintOrder("24"); aa.setBillItemName("代收费"); list.add(aa); aa = new BillTree(); aa.setBillItemTypeID("1001001"); aa.setBillParentID("-100"); aa.setPrintOrder("3"); aa.setBillItemName("语音"); list.add(aa); aa = new BillTree(); aa.setBillItemTypeID("1010021"); aa.setBillParentID("-100"); aa.setPrintOrder("22"); aa.setBillItemName("套餐外费用"); list.add(aa); aa = new BillTree(); aa.setBillItemTypeID("1000010"); aa.setBillParentID("1001001"); aa.setPrintOrder("7"); aa.setBillItemName("特服费"); list.add(aa); aa = new BillTree(); aa.setBillItemTypeID("1010006"); aa.setBillParentID("1001021"); aa.setPrintOrder("15"); aa.setBillItemName("短信费"); list.add(aa); aa = new BillTree(); aa.setBillItemTypeID("1010010"); aa.setBillParentID("1001021"); aa.setPrintOrder("19"); aa.setBillItemName("特服费"); list.add(aa); aa = new BillTree(); aa.setBillItemTypeID("1010022"); aa.setBillParentID("-100"); aa.setPrintOrder("21"); aa.setBillItemName("可选包费用"); list.add(aa); aa = new BillTree(); aa.setBillItemTypeID("1010013"); aa.setBillParentID("1001021"); aa.setPrintOrder("22"); aa.setBillItemName("综合服务信息费"); list.add(aa); aa = new BillTree(); aa.setBillItemTypeID("1010023"); aa.setBillParentID("1001021"); aa.setPrintOrder("29"); aa.setBillItemName("承诺消费补差"); list.add(aa);第1个----test.lId=-100----test.lParentId=-1----test.lPrintID=99999----test.lPrintID=移动电话第2个----test.lId=1001001----test.lParentId=-100----test.lPrintID=3----test.lPrintID=语音第3个----test.lId=1000010----test.lParentId=1001001----test.lPrintID=7----test.lPrintID=特服费第4个----test.lId=1010020----test.lParentId=-100----test.lPrintID=20----test.lPrintID=套餐月基本费第5个----test.lId=1010022----test.lParentId=-100----test.lPrintID=21----test.lPrintID=可选包费用第6个----test.lId=1010021----test.lParentId=-100----test.lPrintID=22----test.lPrintID=套餐外费用第7个----test.lId=1010015----test.lParentId=1001021----test.lPrintID=24----test.lPrintID=代收费第8个----test.lId=1010010----test.lParentId=1001021----test.lPrintID=19----test.lPrintID=特服费第9个----test.lId=1010006----test.lParentId=1001021----test.lPrintID=15----test.lPrintID=短信费第10个----test.lId=1010023----test.lParentId=1001021----test.lPrintID=29----test.lPrintID=承诺消费补差第11个----test.lId=1010013----test.lParentId=1001021----test.lPrintID=22----test.lPrintID=综合服务信息费
public int compare(Object o1, Object o2) { BillTree t1 = (BillTree) o1; BillTree t2 = (BillTree) o2; int id1 = Integer.parseInt(t1.getBillItemTypeId()); int id2 = Integer.parseInt(t2.getBillItemTypeId()); if (id1!=id2) { return id1-id2; } else { int pr1 = Integer.parseInt(t1.getBillParentId()); int pr2 = Integer.parseInt(t2.getBillParentId()); if (pr1!=pr2) return pr1-pr2; else { int or1 = Integer.parseInt(t1.getPrintOrder()); int or2 = Integer.parseInt(t2.getPrintOrder()); return or1-or2; } }}
[解决办法]
没看明白Lz的排序
从2,3,4来看,2,4是同一个父节点,按lId排序,3是2的子节点
从5,6,7,8,9,10,11来看,5,6是同一个节点,按lPrintID排序,7,8,9,10,11是6的子节点,按什么排序?
7,8,9好像按lPrintID或lId反序排序,但是10,11又不是这样了。
LZ的排序描述好像和例子不太相符。
[解决办法]
public static Map<Integer, Set<BillTree>> group(List<BillTree> list) { /* 排序比较器 */ Comparator<BillTree> c = new Comparator<BillTree>() { public int compare(BillTree o1, BillTree o2) { if (o1 == null) { return (o2==null) ? 0 : -1; } else if (o2 == null) { return 1; } else { //先按ParentID排序 Integer i1 = Integer.valueOf(o1.getBillParentID()); Integer i2 = Integer.valueOf(o2.getBillParentID()); if (i1.compareTo(i2) == 0) { //再按PrintOrder排序 Integer i3 = Integer.valueOf(o1.getPrintOrder()); Integer i4 = Integer.valueOf(o2.getPrintOrder()); return i3.compareTo(i4); } return i1.compareTo(i2); } } }; /* 按ParentID分组 */ Map<Integer, Set<BillTree>> map = new TreeMap<Integer, Set<BillTree>>(); for (BillTree b : list) { int parentId = Integer.valueOf(b.getBillParentID()).intValue(); parentId = parentId < 0 ? -parentId : parentId; if (map.containsKey(parentId)) { map.get(parentId).add(b); } else { Set<BillTree> set = new TreeSet<BillTree>(c); set.add(b); map.put(parentId, set); } } /* 打印 */ for (Set<BillTree> set : map.values()) { //层次关系自己控制 for (BillTree b : set) { if (Integer.valueOf(b.getBillParentID()) < 0) { //大层 System.out.println(b); System.out.println(); for (Set<BillTree> set2 : map.values()) { //小层 for (BillTree bb : set2) { if (Integer.valueOf(bb.getBillParentID()) > 0 && bb.getBillParentID().equals(b.getBillItemTypeID())) { System.out.println(bb); System.out.println(); } } } } } } return map; }}//主程序调用Map<Integer, Set<BillTree>> map = group(list);//...
[解决办法]
哎 不知道你们看楼主的算法了没 一塌糊涂 排序的算法不对 怎么实现你的功能? IT的问题就是算法 没解决不了的 前提是你的算法要对 楼主回去巩固一下基础逻辑思维把 你要的功能和你的代码不一致 还来问问题 我很疑惑
[解决办法]