JAVA16——Comparable接口_Treeset与TreeMap

目录

Comparable接口

内置引用数据类型的比较

Treeset与TreeMap


Comparable接口

  • “排序”的实体类都实现了java.lang.Comparable接口, Comparable接口中只有一个方法
    public int compareTo(Object obj);
    该方法:
    • 返回0 表示 this==obj
    • 返回正数表示this>obj
    • 返回负数表示this<obj
  • 实现了 Comparable接口的类通过实现compareTo方法从而确定该类对象的排序方式
  • Collections工具类,提供了大量便于处理容器的方法

引用数据类型:JDK提供的内置的引用数据类型、自定义的引用数据类型

多排序规则:

  • 提供排序的比较器,业务比较器
    实现iava.util.Comparator接口
    重写 public int compare(T o1,T o2)
  • 作用:
    解耦:独立于实体类
    方便:便于应对各种排序规则

内置引用数据类型的比较

比较规则:

整数、小数:根据基本数据类型大小

public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}    //int、float、double

字符:根据Unicode编码排序

public static int compare(char x, char y) {
    return x - y;
} 

String:如果其中一个是另外一个起始开始的字串,返回长度之差;否则返回第一个不相等的unicode码之差

    public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

java.util.Date:根据日期的长整型比较

public int compareTo(Date anotherDate) {
    long thisTime = getMillisOf(this);
    long anotherTime = getMillisOf(anotherDate);
    return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1));
}

eg:数组排序(使用泛型方法)

public class Utils {
	public static <T extends Comparable<T>> void sort(T[] arr){
		boolean sorted = true;
		int len = arr.length;
		for(int j=0;j<len-1;j++){
			sorted = true;
			for(int i=0;i<len-1-j;i++){
				if(((Comparable)arr[i]).compareTo(arr[i+1])<0){
					T temp = arr[i];
					arr[i] = arr[i+1];
					arr[i+1] = temp;
					sorted = false;
				}
			}
			if(sorted){
				break;
			}
		}
	}
	public static void main(String[] args) {
		String[] arr1 = {"32","13","28","40"};
		Utils.sort(arr1);
		System.out.println(Arrays.toString(arr1));
		
		String[] arr2 = {"a","abcd","abc","def"};
		Utils.sort(arr2);
		System.out.println(Arrays.toString(arr2));
	}
}

Treeset与TreeMap

  • TreeMap:确保key可以排序或者提供比较器
    • 确保key可以排序
    • 提供key比较器
    • public TreeMap(Comparator <? super K> comparator)
  • TreeSet
    • 确保元素实体可以排序,不可重复
      • 对比:set接口:HashSet元素必须重写hashcode和equal方法
      • 去重:比较等于0即重复
      • 注意:在添加数据时排序,数据更改不会影响原来的顺序,不要修改数据,否则可能重复
    • 排序比较器
    • public TreeSet(Comparator<? super E> comparator)

eg:

public class Person {
	public final String name;
	public final int handsome;
	
	public Person(String name, int handsome) {
		this.name = name;
		this.handsome = handsome;
	}
	public String getName() {
		return name;
	}
	public int getHandsome() {
		return handsome;
	}
	
	@Override
	public String toString(){
		return "姓名:"+this.name+",帅气指数:"+this.handsome+"\n";
	}
}

TreeSet

public class TreeSetDemo {
	public static void main(String[] args) {
		Person p1 = new Person("you",100);
		Person p2 = new Person("AA",200);
		Person p3 = new Person("BB",50);
		Person p4 = new Person("CC",30);
		
		//依次存放到TreeSet容器中,使用排序的业务类(匿名内部类)
		TreeSet<Person> persons = new TreeSet<Person>(
					new java.util.Comparator<Person>(){
						@Override
						public int compare(Person o1,Person o2){
							return o1.getHandsome()-o2.getHandsome();
						}
					}
		);
		persons.add(p1);
		//TreeSet 在添加数据时排序
		persons.add(p2);
		persons.add(p3);
		persons.add(p4);
		
		System.out.println(persons);
	}
}

 TreeMap

public class TreeMapDemo {
	public static void main(String[] args) {
		Person p1 = new Person("you",100);
		Person p2 = new Person("AA",200);
		Person p3 = new Person("BB",50);
		Person p4 = new Person("CC",30);
		
		TreeMap<Person,String> map = new TreeMap<Person,String>(
				new java.util.Comparator<Person>(){
					@Override
					public int compare(Person o1,Person o2){
						return o1.getHandsome()-o2.getHandsome();
					}
				}
				);
		map.put(p1, "abcde");
		map.put(p2, "abcde");
		map.put(p3, "abcde");
		map.put(p4, "abcde");
		
		Set<Person> persons = map.keySet();
		System.out.println(persons);
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值