黑马程序员技术交流社区
标题:
TreeSet集合需要知道哪些内容?
[打印本页]
作者:
caobin
时间:
2014-12-3 19:29
标题:
TreeSet集合需要知道哪些内容?
本帖最后由 caobin 于 2014-12-3 19:29 编辑
最近视频看得比较慢,才看完TreeSet,感觉老师讲的都理解了,也自己写了一遍,但是隐隐约约有感觉有什么不知道似得。总结一下TreeSet就是两个地方吧,1.元素对象没有比较方法,就用让元素类实现Comparable接口。
2。如果没有比较方法,或者已经有比较方法但是不是所需要的,就定义比较器实现Comparator接口,然后TreeSet集合在创建是调用该比较器,如 new TreeSet(new 比较器()) ,通常建议使用这种方法。
3.至于底层结构二叉树我觉得大家都能够理解并记住吧。
就是不知道还有哪些比较重要的点没提到,谁可以来提醒一下呢?
import java.util.*;
class TreeSetDemo1
{
public static void main(String[] args)
{
//在集合的构造函数中加入实现了Comparator接口的比较器即只调用该比较器,不再调用元素对象的比较方法
TreeSet ts = new TreeSet(new HeightCompare());
ts.add(new Person("lisi02",15,170));
ts.add(new Person("lisi03",15,165));
ts.add(new Person("lisi03",16,186));
ts.add(new Person("lisi01",15,125));
ts.add(new Person("lisi02",17,185));
ts.add(new Person("lisi04",18,170));
Iterator it = ts.iterator();
while(it.hasNext())
{
Person p = (Person)it.next();
System.out.println("Name: "+p.getName()+" Age: "+p.getAge()+" Height:"+p.getHeight());
}
}
}
//定义身高为主的比较器,如果身高相同则比较年龄
class HeightCompare implements Comparator
{
public int compare(Object o1,Object o2)
{
Person p1 = (Person)o1;
Person p2 = (Person)o2;
int num = new Integer(p1.getHeight()).compareTo(new Integer(p2.getHeight()));
if(num==0)
return p1.getAge()-p2.getAge();
return num;
}
}
//在元素对象中定义比较器,比较年龄,如果年龄相同则比较姓名的自然顺序
class Person implements Comparable
{
private String name;
private int age;
private int height;
Person(String name,int age,int height)
{
this.name = name;
this.age = age;
this.height = height;
}
public int getAge()
{
return age;
}
public int getHeight()
{
return height;
}
public String getName()
{
return name;
}
public int compareTo(Object obj)
{
Person p = (Person)obj;
int num = this.getAge()-p.getAge();
if(num==0)
return this.getName().compareTo(p.getName());
return num;
}
}
复制代码
作者:
cbb
时间:
2014-12-3 20:43
两种排序要记住!
作者:
caobin
时间:
2014-12-3 20:50
cbb 发表于 2014-12-3 20:43
两种排序要记住!
什么排序啊?
作者:
cbb
时间:
2014-12-4 00:44
caobin 发表于 2014-12-3 20:50
什么排序啊?
第一种:实现long包下的Comparable 接口它强制让学生具备比较性。
复写的是compareTo,按照自然顺序排序。
当主要条件相同时,一定要判断下次要条件。
第二种:元素自身不具备比较性时,或者具备的比较性不是所需要的,
这时就需要让集合自身具备比较性。
在集合初始化时候,就定义比较器。实现Comparator接口 复写compare
作者:
小凡_fly
时间:
2014-12-5 09:34
这个是我以前做的笔记 楼主可以看看希望可以帮到你:
/*
* TreeSet: 1.向TreeSet中添加的元素必须是同一个类的。
* 2.可以按照添加进集合中的元素的指定的顺序遍历。像String,包装类等默认按照从小到大的顺序遍历。
* 3.当向TreeSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序
* 4.自然排序:要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法
* 在此方法中,指明按照自定义类的哪个属性进行排序。
*
* 5.向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的此
* 属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。
*
* >compareTo()与hashCode()以及equals()三者保持一致!
*/
@Test
public void testTreeSet1() {
Set set = new TreeSet();
// set.add(new String("AA"));
// set.add(new String("AA"));
// set.add("JJ");
// set.add("GG");
// set.add("MM");
// 当Person类没有实现Comparable接口时,当向TreeSet中添加Person对象时,报ClassCastException
set.add(new Person("CC", 23));
set.add(new Person("MM", 21));
set.add(new Person("GG", 25));
set.add(new Person("JJ", 24));
set.add(new Person("KK", 20));
set.add(new Person("DD", 20));
// set.add("AA");
for (Object str : set) {
System.out.println(str);
}
}
复制代码
下面是person类
//当向TreeSet中添加Person类的对象时,依据此方法,确定按照哪个属性排列。
@Override
public int compareTo(Object o) {
if(o instanceof Person){
Person p = (Person)o;
//return this.name.compareTo(p.name);
//return -this.age.compareTo(p.age);
int i = this.age.compareTo(p.age);
if(i == 0){
return this.name.compareTo(p.name);
}else{
return i;
}
}
return 0;
}
复制代码
作者:
as604049322
时间:
2014-12-5 12:08
哦?{:3_46:}{:3_46:}{:3_46:}
作者:
没伞的孩子
时间:
2014-12-5 17:03
回答的很好 我也受教了
第一种:实现long包下的Comparable 接口它强制让学生具备比较性。
复写的是compareTo,按照自然顺序排序。
当主要条件相同时,一定要判断下次要条件。
第二种:元素自身不具备比较性时,或者具备的比较性不是所需要的,
这时就需要让集合自身具备比较性。
在集合初始化时候,就定义比较器。实现Comparator接口 复写compare
作者:
cczheng
时间:
2014-12-6 08:10
看到TreeSet了,还不加上泛型
作者:
Smart_lll
时间:
2014-12-7 19:21
我的基础测试的最后一道题貌似和这个类似~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2