前言:文字太多容易反感。仔细看代码及其注释,让代码说明一切!
目录
Comparator
代码1:
package collection2;
import java.util.Comparator;
import java.util.Iterator;
/*compareTo方法--------
* public int compareTo(Integer anotherInteger){
return compare(this.value,anotherInteger.value);
}
String的compareTo方法---------
public int compareTo(String anotherInteger){}
*/
/*
* 按自己的规则排序:重写compareTo方法
* 二叉树比较:先跟根节点比,如果比它小就放到左子树;如果下一个树进来后比它大则跟右边的比
*/
import java.util.TreeSet;
class MyComparator implements Comparator{
public int compare(Object o1,Object o2){
System.out.println(o1+" 和 "+o2+" 比");
Integer i1=(Integer)o1;
Integer i2=(Integer) o2;
return i2-i1; //如果i1>i2肯定返回一个大于0的值
// if(i1>i2) return 1; //返回一个大于0的值
// else if(i1<i2) return -1;
// else return 0;
}
}
//TreeSet的构造器中要传入一个Comparator类型的参数
public class SortedSetTest2 {
public static void main(String args[]){
MyComparator m=new MyComparator();
TreeSet set=new TreeSet(m);
set.add(234);
set.add(4);
set.add(18);
set.add(762);
set.add(38);
Iterator it=set.iterator();
while(it.hasNext()){
System.out.println(it.next()+" "); //默认自然数排序
}
}
}
/*
234 和 234 比
4 和 234 比
18 和 234 比 先跟根节点比,放左边
18 和 4 比 再跟4比,比4大,放4的右子树,此时两边不平衡,根节点转换为18,18作为234的左子树,然后将234向下挪
762 和 18 比 762比18大,再去跟18的右子树也就是跟234比
762 和 234 比
38 和 18 比
38 和 234 比
*/
代码2:
package collection2;
/*
* 计算机中,return 只要是个大于0的值,那么计算机认为一定是i1>i2;
* 或者说是234进去后,执行4-234,计算机执行时4-234<0,实际上234-4>0 即4应该放右边
* 也就是说,如果自己想重写compare方法来使其倒序输出,可以return i2-i1;
* return this.age17-p.age19;jsj减出来是大于0
* 判断大于0:i1>i2,i1放到右子树,如果return i2-i1;即i2>i1,实际上i1<i2,右子树放小的数,
*/
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
class MComparator implements Comparator{
public int compare(Object o1,Object o2){
System.out.println(o1+" 和 "+o2+" 比");
Integer i1 =(Integer)o1;
Integer i2=(Integer)o2;
// return i1-i2;
// return i2-i1;
// return -i2.compareTo(i1);
return i2.compareTo(i1); //因为Integer本身有自然排序规则
}
}
public class SortedSetTest3 {
public static void main(String args[]){
MComparator m=new MComparator();
TreeSet set=new TreeSet(m);
set.add(234);
set.add(4);
set.add(18);
set.add(762);
set.add(38);
Iterator it=set.iterator();
while(it.hasNext()){
System.out.println(it.next()+" "); //默认自然数排序
}
}
}
Comparable
package collection2;
import java.util.TreeSet;
/**
* TreeSet:有序不重复,(底层维护的时TreeMap的实例)
* @author HYZX
* 要对Person进行自然排序,显然与Comparable接口的自然排序冲突,此时需要Person类实现Comparable接口
* return p.age-this.age;计算机当作是(return this.age-p.age)
* 返回>0的值代表this大于这个值,而如果交换,结果小于0代表this小于这个值,会将this放到左子树,而this实际上是大的那个值,
* 如果写成了return p.age-this.age,也就是左边成了大的,右边成了小的
*/
class Person implements Comparable{
String name;
int age;
String sex;
public Person(){}
public Person(String n,int a,String sex){
this.name=n;
this.age=a;
this.sex=sex;
}
//实现了Comparable接口,因此可以调用compareTo方法
public int compareTo(Object obj) {
Person p=(Person)obj;
if(this.age==p.age){
return this.name.compareTo(p.name); //如果年龄相等就按照姓名排序
}
else {
return this.age-p.age;
}
// return p.age-this.age; //按年龄倒序输出,相同年龄的只能加入第一个,后续年龄重复的加不进去。
// return this.name.compareTo(p.name); //按姓名字符串顺序输出
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age+",性别:"+this.sex;
}
}
public class PersonSorted {
public static void main(String args[]){
TreeSet set=new TreeSet();
set.add(new Person("zhangsan",21,"女"));
set.add(new Person("aaaa",21,"女")); //如果年龄相同,先输出的将是此句
set.add(new Person("wangwu",24,"男"));
set.add(new Person("wanu",24,"男"));
set.add(new Person("lisi",22,"男"));
set.add(new Person("lisi",22,"男"));
for(Object o:set){
System.out.println(o+" ");
}
}
}