免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2241 | 回复: 2
打印 上一主题 下一主题

求助:一个关于TreeSet的问题,存在困惑! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-06 22:34 |只看该作者 |倒序浏览
问题描述:现有一些客户数据要做统计筛选,设计用TreeSet来装载数据。将客户数据放入树中,对客户金额排序,当遇到客户号相同时,插入树时,将余额相加!代码如下:
先设计一个节点类(filenam:TradeNode.java):
import java.util.Comparator;

public class TradeNode implements Comparable<TradeNode> {
    private String cstm; // 客户号

    private Integer mon = 0; // 交易金额


    public TradeNode(String cstm, int mon) {
        this.mon = mon;
        this.cstm = cstm;
    }

    public int compareTo(TradeNode o) {
        if (o.cstm.equals(this.cstm)) {
            o.mon += this.mon;
            return 0;
        } else if (this.mon == o.mon) {
            return this.cstm.compareTo(o.cstm);
        } else {
            return (o.mon - this.mon);
        }
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub

        return "[" + cstm + "] [" + mon + "]";
    }

    public int getMon() {
        return mon;
    }

    public void setMon(Integer mon) {
        this.mon = mon;
    }

    public String getCstm() {
        return cstm;
    }
}


然后继承了TreeSet重写了add函数(filename:LsTree.java):
import java.util.TreeSet;

public class LsTree extends TreeSet<TradeNode> {
    // 添加子节点

    public boolean add(TradeNode node) {
        // System.out.println("add node="+node);

        if (contains(node)) {
            return true;
        }
        return super.add(node);
    }
}

测试(filename:testtree2.java:
public class testtree2 {
    public static void main(String[] args) {
        TradeNode nd1 = new TradeNode("44010358010481", 150354);
        TradeNode nd2 = new TradeNode("44010358010481", 150641);
        TradeNode nd3 = new TradeNode("44010358010481", 270000);
        TradeNode nd4 = new TradeNode("44010039275685", 10000);
        TradeNode nd5 = new TradeNode("44010039275685", 980000);
        TradeNode nd6 = new TradeNode("44010039275685", 5000);
        LsTree tree = new LsTree();
        tree.add(nd1);
        tree.add(nd2);
        tree.add(nd3);
        tree.add(nd4);
        tree.add(nd5);
        tree.add(nd6);
        for (TradeNode node : tree) {
            System.out.println(node);
        }
    }

}

得到的结果:
[44010039275685] [980000]
[44010358010481] [570995]
[44010039275685] [15000]


按我的想法,该树应该只有两个节点,可是输出却是3个节点,左思右想不明白,测试数据修改后有时又能得到正确的结果。刚学习java没多久,请大家帮忙看看!谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-08-07 08:55 |只看该作者

自己解决!

做测试:
public class testtree {
    public static void main(String[] args) {
        TradeNode nd1 = new TradeNode("A", 100);
        TradeNode nd2 = new TradeNode("B", 10);
        TradeNode nd3 = new TradeNode("B", 1000);
        LsTree tree = new LsTree();
        tree.add(nd1);
        tree.add(nd2);
        tree.add(nd3);
        for (TradeNode node : tree) {
            System.out.println(node);
        }
    }
}
树是二叉树,当调用contains方法时,是对余额排序,存在节点与插入节点如果分布在树的两侧,则必然导致,以上结果。

论坛徽章:
0
3 [报告]
发表于 2009-08-16 13:56 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP