java学习:容器排序:TreeMap和TreeSet实现自定义排序的使用方法?两者的区别?

TreeMap和TreeSet实现自定义排序的实现

1、TreeMap实现自定义排序

(1)构造函数中new Comparator,匿名内部类,重写compare 方法。
(2)实体类实现Comparable,重写compareTo方法。

(1)构造函数中new Comparator,匿名内部类,重写compare 方法。

实体类:

public class Person {
	private final String name;
	private final int handsome;//帅气值
	public String getName() {
		return name;
	}
	public int getHandsome() {
		return handsome;
	}
	public Person(String name, int handsome) {
		super();
		this.name = name;
		this.handsome = handsome;
	}
	public Person() {
			name=null;
			handsome=0;
	}
	@Override
	public String toString() {
		return "名字:" + name + ", 帅气值: " + handsome + "\n";
	}
}

自定义排序:

public class TreeMapDemo {

	public static void main(String[] args) {

		Person p1 = new Person("刘德华", 100);
		Person p2 = new Person("赵小花", 30);
		Person p3 = new Person("王大华", 90);
		Person p4 = new Person("邓小二", 600);
		Person p5 = new Person("杨柳", 50);

		// 使用排序的业务类(匿名内部类)
		TreeMap<Person, String> map = new TreeMap<Person, String>(
				new Comparator<Person>() {
					@Override
					public int compare(Person o1, Person o2) {
						return o1.getHandsome() - o2.getHandsome();//帅气值升序
					}
				});
		map.put(p1, "ll");
		map.put(p2, "ll");
		map.put(p3, "ll");
		map.put(p4, "ll");
		map.put(p5, "ll");
		
		for(Person per:map.keySet()){
			System.out.println(per.getName()+"的帅气值:   "+per.getHandsome());
		}

//		// 查看键
//		Set<Person> persons = map.keySet();
//
//		System.out.println(persons);

	}
}

运行结果:在这里插入图片描述

(2)实体类实现Comparable,重写compareTo方法。

实体类:实现comparable接口,重写compareto方法。

public class Worker implements Comparable<Worker>{
	private String type;//工种
	
	private double salary;

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	public Worker(String type, double salary) {
		super();
		this.type = type;
		this.salary = salary;
	}

	@Override
	public String toString() {
		return "工种:" + type + ",工资:" + salary + "\n";
	}

	public Worker() {
		}
	
	public int compareTo(Worker o){//工资升序
		return (this.getSalary()-o.getSalary())>0?1:(this.getSalary()-o.getSalary())==0?0:-1;
		
	}

}

应用:

public class TreeMapDemo02 {
	public static void main(String[] args) {

		Worker w1 = new Worker("回收员", 12000);
		Worker w2 = new Worker("思想者", 60000);
		Worker w3 = new Worker("农民工", 30000);
		Worker w4 = new Worker("打字员", 5000);
		Worker w5 = new Worker("售货员", 10000);

		// 使用排序的实体类实现
		TreeMap<Worker, String> map = new TreeMap<>();
		map.put(w1, "ll");
		map.put(w2, "ll");
		map.put(w3, "ll");
		map.put(w4, "ll");
		map.put(w5, "ll");

		for(Worker per:map.keySet()){
			System.out.println(per.getType()+"的工资:   "+per.getSalary());
		}
	}
}

运行结果:
在这里插入图片描述

2、TreeSet实现自定义排序

与TreeMap完全相同。
(1)构造函数中new Comparator,匿名内部类,重写compare 方法。
(2)实体类实现Comparable,重写compareTo方法。

(1)构造函数中new Comparator,匿名内部类,重写compare 方法。

public class TreeSetDemo {

	public static void main(String[] args) {

		Person p1 = new Person("刘德华", 100);
		Person p2 = new Person("赵小花", 30);
		Person p3 = new Person("王大华", 90);
		Person p4 = new Person("邓小二", 600);
		Person p5 = new Person("杨柳", 50);

		// 使用排序的业务类(匿名内部类)
		TreeSet<Person> persons = new TreeSet<Person>(new Comparator<Person>() {
			@Override
			public int compare(Person o1, Person o2) {
				return -(o1.getHandsome() - o2.getHandsome());//降序
			}
		});
		//treeset在添加数据的时候,就进行排序了。
		//数据更改不会影响原来的顺序。
		//treeset在使用时,不要修改数据,否则可能会造成数据重复。
		//可以用final修饰原对象
		persons.add(p1);
		persons.add(p2);
		persons.add(p3);
		persons.add(p4);
		persons.add(p5);
		
		for(Person per:persons){
			System.out.println(per.getName()+"  帅气分数:  "+per.getHandsome());
		}

	}
}

(2)实体类实现Comparable,重写compareTo方法。

public class TreeSetDemo02 {

	public static void main(String[] args) {
		Worker w1 = new Worker("回收员", 12000);
		Worker w2 = new Worker("思想者", 60000);
		Worker w3 = new Worker("农民工", 30000);
		Worker w4 = new Worker("打字员", 5000);
		Worker w5 = new Worker("售货员", 10000);

		// 使用排序的实体类实现
		TreeSet<Worker> workers = new TreeSet<>();
		workers.add(w1);
		workers.add(w2);
		workers.add(w3);
		workers.add(w4);
		workers.add(w5);

		System.out.println(workers);

	}

(3)需注意的TreeSet和TreeMap的不同之处

TreeSet在添加数据的时候,就进行排序了。所以在之后操作更改数据,不会影响原来的排序。
所以在使用TreeSet的时候,需要注意不要修改数据,否则会造成数据错误。
当然,我们可以用final修饰原对象。

发布了57 篇原创文章 · 获赞 13 · 访问量 1117

猜你喜欢

转载自blog.csdn.net/weixin_42924812/article/details/105179696