关于Comparable接口和Comparetor接口的两种排序

Comparable接口

TreeSet:实现去重和排序的方式:1.让元素去实现Comparable接口,重写compareTo方法

public class Demo {
	public static void main(String[] args) {
		// TreeSet:实现去重和排序的方式:
		//1.让元素去实现Comparable接口,重写compareTo方法------默认排序
		//学习第一种
		//1.让元素去实现Comparable接口,重写compareTo方法------默认排序
		TreeSet set = new TreeSet<>();
		//使用TreeSet在存储字符串的时候自动实现了排序和去重
		//因为在add方法中调用了Comparable接口的compareTo方法
		//默认是按照升序字典顺序排序
		set.add("java1");
		set.add("java4");
		set.add("java2");
		set.add("java5");
		set.add("java2");
		System.out.println(set);
		
		//实例:将Person2的对象存入TreeSet,按照姓名和年龄比较
		TreeSet<Person2> set1 = new TreeSet<>();
		set1.add(new Person2("bingbing1", 18));
		set1.add(new Person2("bingbing2", 18));
		set1.add(new Person2("bingbing3", 183));
		set1.add(new Person2("bingbing3", 183));
		set1.add(new Person2("bingbing0", 17));
		System.out.println(set1);
	}
}

//自定义的类实现Comparable接口
class Person2 implements Comparable<Person2>{
	String name;
	int age;
	public Person2(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person2 [name=" + name + ", age=" + age + "]";
	}
	
	@Override
	//自己制定的规则:按照年龄和姓名比较
	/*
	 *返回正数,代表前面的比后面的大
	 *返回0,代表前后相等
	 *返回负数,代表前面的比后面的小
	 */
	public int compareTo(Person2 person2) {

		//先按照年龄比较,年龄相同再去比姓名
		int num = this.age-person2.age;
		return num==0?name.compareTo(person2.name):num;
	}
}


Comparetor接口

比较器类,让他实现Comparetor接口,重写compare方法,再将比较器对象作用于TreeSet,内部的元素会按照比较器进行比较.—人工排序

public class Demo11 {
	public static void main(String[] args) {
		//第二种
		
		//2.创建比较器对象,并指定给存储元素的TreeSet
		ComWithLength comWithLength = new ComWithLength();
		
		TreeSet set = new TreeSet<>(comWithLength);
		//使用TreeSet在存储字符串的时候自动实现了排序和去重
		
		set.add("java1111111111111");
		set.add("java422");
		set.add("java2456");
		set.add("java523535");
		set.add("java2456");
		System.out.println(set);
	}
}

//1.创建比较器类
class ComWithLength implements Comparator<String>{
	public int compare(String s1, String s2) {
	
		//要求按照字符串的长度对字符串进行排序--从短到长,当长度相同的时候,按照字典排序
		int num = s1.length()-s2.length();
		return num==0?s1.compareTo(s2):num;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值