读书人

关于list内部排序有关问题?就是那么奇

发布时间: 2012-06-20 20:37:21 作者: rapoo

关于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 最小的就是根节点 下来是子节点
[解决办法]
不知道说清楚没
[解决办法]
探讨

引用:

说一下你想排成什么样吧。


父节点为-1的排最前面
然后父节点为-100的 按照printorder排序 如果 父节点为-100的下面有子节点则按照printorder小的排在上面 下面是子节点
-1
-100
1
2
-100
3
4

[解决办法]
探讨

引用:

不知道说清楚没
父节点子节点能分清楚哈 主要是 父节点 子节点 下面还有子节点总共三层

[解决办法]
等于是你有几层节点最后 map就有几条记录
map的 key值是parentid value 是存放该parentid 的对象集合
[解决办法]
那你这个排序的代码就写的有问题啊
[解决办法]
探讨

引用:

引用:

不知道说清楚没
父节点子节点能分清楚哈 主要是 父节点 子节点 下面还有子节点总共三层

你仔细看明白了没
-1为节点的 是不是只有一个 假设这是map的一条数据
以-100为key的 这个list 是不是二级接点
1001021 不就是三级节点
只要你找到最少的……

[解决办法]
你们扯吧。今天感冒了,难受的要死
[解决办法]
探讨

引用:

等于是你有几层节点最后 map就有几条记录
map的 key值是parentid value 是存放该parentid 的对象集合

现在关键是他在一个list里我不知道如何处理了。。。现在list里面是实体对象

[解决办法]
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的排序描述好像和例子不太相符。

[解决办法]

探讨

要是我没理解错,是有三层
首先按billItemTypeId排序
billItemTypeId相同的,按billParentId排序
billParentId相同的,按printOrder排序

Java code

public int compare(Object o1, Object o2) {
BillTree t1 = (BillTree) o1;
……

[解决办法]
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的问题就是算法 没解决不了的 前提是你的算法要对 楼主回去巩固一下基础逻辑思维把 你要的功能和你的代码不一致 还来问问题 我很疑惑
[解决办法]
探讨
哎 不知道你们看楼主的算法了没 一塌糊涂 排序的算法不对 怎么实现你的功能? IT的问题就是算法 没解决不了的 前提是你的算法要对 楼主回去巩固一下基础逻辑思维把 你要的功能和你的代码不一致 还来问问题 我很疑惑

[解决办法]
list
中放map
[解决办法]
至于你们顶不顶贴,我就是顶贴了!

读书人网 >J2EE开发

热点推荐