黑马程序员17-6:TreeSet的Comparator比较器接口以及compareTo优化写法

[align=center]------- [url=http://edu.youkuaiyun.com/heima]android培训 [/url]、[url=http://edu.youkuaiyun.com/heima]java培训[/url]、期待与您交流!------- [/align]



package cn.itcast.p.bean;

import java.util.ArrayList;
import java.util.Iterator;


public class Person /*extends Object*/ implements Comparable {

public static void main(String []augs){
// Person p = new Person("p1",3);
ArrayList al = new ArrayList();
al.add(new Person("p1",3));
al.add(new Person("p2",2));
al.add(new Person("p3",3));
al.add(new Person("p4",4));
al.add(new Person("p5",5));

Iterator it = al.iterator();
while(it.hasNext()){
Person p = (Person) it.next();
System.out.println(p.getName() + " " + p.getAge());
}

}


private String name;
private int age;


public Person() {
super();

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



@Override
public int hashCode() {
// System.out.println(this+".......hashCode");

return name.hashCode()+age*37;
// return 100;
}
@Override
public boolean equals(Object obj) {

if(this == obj)
return true;
//健壮性判断
if(!(obj instanceof Person))
throw new ClassCastException("类型错误");

// System.out.println(this+"....equals....."+obj);
Person p = (Person)obj;



return this.name.equals(p.name) && this.age == p.age;
}
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;
}
public String toString(){
return name+":"+age;
}
//在TreeSet里边进行排序比较,需要重写这个方法
@Override
public int compareTo(Object o) {

//要做健壮性判断
if(!(o instanceof Person)){
throw new ClassCastException("类型不匹配异常");
}
Person p = (Person)o;

int temp = this.age-p.age;
return temp==0?this.name.compareTo(p.name):temp;

// int temp = this.name.compareTo(p.name);
// return temp==0?this.age-p.age:temp;

/*
if(this.age>p.age)
return 1;
if(this.age<p.age)
return -1;

else{

return this.name.compareTo(p.name);
}
*/

}

}




package cn.itcast.p5.treeset.demo;

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

import cn.itcast.p.bean.Person;
import cn.itcast.p5.comparator.ComparatorByName;

public class TreeSetDemo {

/**
* @param args
*/
public static void main(String[] args) {

TreeSet ts = new TreeSet(new ComparatorByName());

/*
* ��Person����������д�С���������
*
*/

ts.add(new Person("zhangsan",28));
ts.add(new Person("lisi",21));
ts.add(new Person("zhouqi",29));
ts.add(new Person("zhaoliu",25));
ts.add(new Person("wangu",24));

Iterator it = ts.iterator();

while(it.hasNext()){
Person p = (Person)it.next();

System.out.println(p.getName()+":"+p.getAge());
}

}


/**
*
*/
public static void demo1() {
TreeSet ts = new TreeSet();

ts.add("abc");
ts.add("zaa");
ts.add("aa");
ts.add("nba");
ts.add("cba");

Iterator it = ts.iterator();

while(it.hasNext()){
System.out.println(it.next());
}
}

}



package cn.itcast.p5.comparator;

import java.util.Comparator;

import cn.itcast.p.bean.Person;
/**
* ������һ�����Person���name��������ıȽ�����
*/
public class ComparatorByName implements Comparator {

@Override
public int compare(Object o1, Object o2) {

Person p1 = (Person)o1;
Person p2 = (Person)o2;
//比较姓名(compareTO,就是按字典比较顺序比较字符串大小,也就是比较名字字符串的大小)
int temp = p1.getName().compareTo(p2.getName());
//如果名字相同,则继续比较年龄
return temp==0?p1.getAge()-p2.getAge(): temp;
// return 1;//����
}

}



package cn.itcast.p5.comparator;

import java.util.Comparator;

public class ComparatorByLength implements Comparator {

@Override
public int compare(Object o1, Object o2) {
String s1 = (String)o1;
String s2 = (String)o2;
//比较对象(字符串)的长度,也就是有多少个
int temp = s1.length()-s2.length();
System.out.println("s1: " + s1 + " " + "s2: "+ s2 + " ");
//当长度相等的时候,再比较内容,也就是哪个大
return temp==0? s1.compareTo(s2): temp;
}

}




package cn.itcast.p5.treeset.test;

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

import cn.itcast.p5.comparator.ComparatorByLength;

/*
* ���ַ���г�������
*
* "20 18 -1 89 2 67"
*/

public class TreeSetTest {

/**
* @param args
*/
public static void main(String[] args) {

TreeSet ts = new TreeSet(new ComparatorByLength());

ts.add("aaaaa");
ts.add("zz");
ts.add("nbaq");
ts.add("cba");
ts.add("abc");

Iterator it = ts.iterator();

while(it.hasNext()){
System.out.println(it.next());
}
}

}




TreeSet是按自定义或者默认比较器进行排序的元素唯一的集合。
使用TreeSet

|--TreeSet:可以对Set集合中的元素进行排序。是不同步的。
判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。
TreeSet对元素进行排序的方式一:
让元素自身具备比较功能,元就需要实现Comparable接口。覆盖compareTo方法。
如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?
可以使用TreeSet集合第二种排序方式二:
让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。将该类对象作为参数传递给TreeSet集合的构造函数。


[align=center]------- [url=http://edu.youkuaiyun.com/heima]android培训 [/url]、[url=http://edu.youkuaiyun.com/heima]java培训[/url]、期待与您交流!------- [/align]

[align=center]详细请查看:[url=http://edu.youkuaiyun.com/heima]http://edu.youkuaiyun.com/heima [/url]------- [/align]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值