关于list内部排序问题?就是那么奇怪呀!!!!
list数据如下:
- Java code
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);想将id=-1的放到第一位 ParentID=-100的排第二位 PrintOrder是相同的父节点排序用的 如果有对象的父节点是这个对象的话 要放到这个下面
最后的结果要像如下:
- Java code
第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=综合服务信息费
[解决办法]
排序为什么不直接用Collection.sort()
[解决办法]
lz
用用Collections.sort(list);
集合的辅助类 帮助集合排序等功能
[解决办法]
哎 你到底想问什么呀?
排序 一种是在数据库已经排好序
另外就是自己操作集合的顺序结果 一般是将结果重新存入一个新的集合
我都现在不知道你到底是按这个对象的那个属性 排序
能不能挑重点讲
[解决办法]
说一下你想排成什么样吧。
[解决办法]
我靠 打了半天没提交上去
简单重新打吧
你把你的数据 重新放在一个map<String,List>中,String为 ParentId list放 ParentId一样的对象
这样存完下来 遍历这个map list的size 最小的就是根节点 下来是子节点
[解决办法]
不知道说清楚没
[解决办法]
[解决办法]
[解决办法]
等于是你有几层节点最后 map就有几条记录
map的 key值是parentid value 是存放该parentid 的对象集合
[解决办法]
那你这个排序的代码就写的有问题啊
[解决办法]
[解决办法]
你们扯吧。今天感冒了,难受的要死
[解决办法]
[解决办法]
arraylist API中有这个方法
set(int index, E element)
用指定的元素替代此列表中指定位置上的元素。
[解决办法]
看上去还真挺奇怪。
[解决办法]
顶楼上的,楼主加油啊!祝楼主好运
[解决办法]
回头加分
[解决办法]
要是我没理解错,是有三层
首先按billItemTypeId排序
billItemTypeId相同的,按billParentId排序
billParentId相同的,按printOrder排序
- Java code
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的排序描述好像和例子不太相符。
[解决办法]
[解决办法]
LZ的list因为有父子节点的层次关系,所以一次排序是不可能得到结果的,要采用14L说的,按parentId分组,然后再排序打印
给你一段小测试代码
- Java code
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的问题就是算法 没解决不了的 前提是你的算法要对 楼主回去巩固一下基础逻辑思维把 你要的功能和你的代码不一致 还来问问题 我很疑惑
[解决办法]
[解决办法]
list
中放map
[解决办法]
至于你们顶不顶贴,我就是顶贴了!