A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄敏文 黑马帝   /  2011-9-4 14:59  /  1808 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[code=java]
package cn.itcast.utils;

import java.util.Iterator;
import java.util.TreeSet;

/*
* 按照学生的年龄进行排序,如果年龄相同则按姓名的自然顺序进行排序
*/
public class TreeSetTest {
        public static void main(String[] args) {
                TreeSet ts = new TreeSet();
                ts.add(new Student("lisi02", 22));
                ts.add(new Student("lisi007", 20));
                ts.add(new Student("lisi09", 19));
                ts.add(new Student("lisi08", 19));
//                 ts.add(new Student("lisi01", 40));

                for (Iterator it = ts.iterator(); it.hasNext();) {
                        Student s = (Student) it.next();
                        System.out.println(s.getName() + "::" + s.getAge());
                }
        }
}

//让学生实现Comparable接口,从而具备比较性
class Student implements Comparable {
        private String name;
        private int age;

        public Student(String name, int age) {
                this.name = name;
                this.age = age;
        }

        @Override
        public int compareTo(Object o) {
                if (!(o instanceof Student)) {
                        throw new RuntimeException("不是学生对象");
                }

                Student s = (Student) o;

                System.out.println(this.getName() + "...compareto..." + s.getName());

                if (this.getAge() > s.getAge()) {
                        return 1;
                }

                if (this.getAge() == s.getAge()) {
                        return this.getName().compareTo(s.getName());
                }

                return -1;
        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }

}
[/code]

打印结果如下:
lisi007...compareto...lisi02
lisi09...compareto...lisi02
lisi09...compareto...lisi007
lisi08...compareto...lisi007
lisi08...compareto...lisi09
lisi08::19
lisi09::19
lisi007::20
lisi02::22


疑问:lisi08为什么没有跟lisi02进行比较,而是直接和lisi007,lisi09比较

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

5 个回复

倒序浏览

回复 楼主 的帖子

TreeSet里面应该是使用二分插入排序来实现的:
当把lisi09插入之后,情况应该是这样的:
lisi09::19
lisi007::20
lisi02::22
二分插入排序就是首先和中间的比较,也就是lisi007
lisi08的年龄比lisi007小,它就不会和lisi02比较了,
就是去和lisi09比较。
大概就是这样样子。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-4 20:41:15
藤椅

回复 沙发 的帖子

[quote]TreeSet里面应该是使用二分插入排序来实现的:
[/quote]

二分插入是二叉树么
回复 使用道具 举报
黑马网友  发表于 2011-9-5 09:42:52
板凳

回复 藤椅 的帖子

我觉得应该不是。你可以看看源码就知道了。
回复 使用道具 举报
黑马网友  发表于 2011-9-10 14:22:48
报纸
不是同一个概念,二叉树是一种数据组成结构,二分插入是一种查找法。
二叉树的某种遍历法似乎倒是跟二分查找法相似。
回复 使用道具 举报
黑马网友  发表于 2011-9-10 19:56:22
地板
我记得是用红黑树实现的。具体如何也不知道,但效率略低于hashset,因为他是有序的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马