TreeSet的自然排序与定制排序

新手自己记录,方便以后自己查看
附上其他大佬的文章
链接: https://blog.csdn.net/Jsagacity/article/details/76039333
https://www.cnblogs.com/mercuryli/p/4620435.html
首先先简介一下set集合
set集合继承于collection接口下面的子类有HashSet,SortedSet,EnumSet

HashSet:
实现了set接口,由HashMap支持,他不保证迭代顺序,无序的且不可重复(存储和取出的顺序都不同),没有索引,不存储重复元素。
LinkedHashSet:
是HashSet的子类,不允许元素重复,并且保证元素的插入顺序,底层是哈希表和链表算法。由于多使用了一个链表来记录元素的插入顺序所以性能较HashSet低,如果要求一个集合急要保证元素不重复,也需要记录元素的先后添加顺序,才选择使用LinkedHashSet
TreeSet:
是SortedSet的子类,能够对集合中的对象进行排序

自然排序和定制排序:

自然排序:
要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法在此方法中,指明按照自定义类的哪个属性进行排序。向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的此属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。因此要求compareTo()与hashCode()以及equals()三者保持一致!

贴代码啦!






package model;

//实现Comparable<> 接口
public class User implements Comparable<User>{
	private Integer id;
	private String name;
	private Integer age;
	private String sex;
	
	
	
	public User(Integer id, String name, Integer age, String sex) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	public User() {
		super();
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	public boolean equals(Object obj) {
		return super.equals(obj);
	}
	/**
	 * 实现实现Comparable<> 接口的compareTo方法
	 * instanceof方法判断   某参数是否是某一个对象的实例
	 * Comparator<>()	比较器:返回对此set元素进行排序的比较器,如果此Set使用其元素的自然排序顺序,则返回NULL
	 */
	
	@Override
	public int compareTo(User o) {
		if(o instanceof User) { //判断o是否是User对象的一个实例
			User user = o;
			//按字典顺序比较两个字符串,
			//compareTo就是比较两个值,如果前者大于后者,返回1,等于返回0,小于返回-1
			//return -1; //-1表示放在红黑树的左边,即逆序输出
			//return 1;  //1表示放在红黑树的右边,即顺序输出
			//return 0;  //表示元素相同,仅存放第一个元素
			//如果这两个字符串相等,则结果为 0
			int result = user.getAge().compareTo(this.age);
			//有一个写法 :int num1=result==0?this.sex.compareTo(user.getSex()):result;
			//如果结果为0则判断性别,根据性别排序。否则result排序
			if(result == 0) {
				return this.sex.compareTo(user.getSex());
			}else {
				return result;
			}
		}
		return 0;
	}

}

下面是方法!

package one;

import java.util.Set;
import java.util.TreeSet;
import model.User;

public class test01 {
	
		public static void main(String[] args) {
			Set<User> set = new TreeSet<>();
			set.add(new User(1, "张飞", 10, "女"));
			set.add(new User(2, "李白", 10, "男"));
			set.add(new User(3, "刘备", 30, "女"));
			set.add(new User(4, "关羽", 20, "男"));
			set.add(new User(5, "奥尔良", 20, "女"));
			set.add(new User(5, "奥尔良", 20, "女"));
			System.out.println(set.size());
			for (User user : set) {
				System.out.println(user.getId()+"--"+user.getName()+"--"+user.getSex()+
						"--"+user.getAge());
			}
		}
}

定制排序:

	定制排序和自然排序写法差不多。
		自然排序是在javaBean中实现Comparable<>接口定制排序规则。
		定制排序则是直接在当前类中实现Comparator<>接口定制排序规则。
public class test01 implements Comparator<User> {//实现Comparator接口
	
	@Override
	public int compare(User arg0, User arg1) {//定制排序规则
		if(arg0 instanceof User && arg1 instanceof User) {//判断前一个字段是否为User类的一个实例
			Integer sum = arg1.getAge()-arg0.getAge();	//年龄排序
			return sum==0?(arg0.getSex().compareTo(arg1.getSex())):sum;//年龄相同则按照性别
		}
		return 0;
	}
	
	public static void main(String[] args) {
		Set<User> set = new TreeSet<>(new test01());
		set.add(new User(1, "张飞", 10, "女"));
		set.add(new User(2, "李白", 10, "男"));
		set.add(new User(3, "刘备", 30, "女"));
		set.add(new User(4, "关羽", 20, "男"));
		set.add(new User(5, "奥尔良", 20, "女"));
		set.add(new User(5, "奥尔良", 20, "女"));
		System.out.println(set.size());
		for (User user : set) {
			System.out.println(user.getId()+"--"+user.getName()+"--"+user.getSex()+
					"--"+user.getAge());
		}
	}

猜你喜欢

转载自blog.csdn.net/weixin_42563880/article/details/84673962
今日推荐