自定义对象排序Java

在项目开发中,有时API提供的方法不能满足实际需求,就需要自定义方法来进行,比如说,对一组对象进行排序,先根据学号排序,学号一样(假设有学号一样的学生),再根据年龄进行排序,年龄一样的再根据姓名排序,下面用两种方式实现。
第一种:Comparable接口实现
测试类:

import java.util.Set;
import java.util.TreeSet;
public class Text {

	public static void main(String[] args) {
	//这里可以使用其他集合,但是不能使用HashSet
		Set<Person> sp=new TreeSet<Person>();
		Person p1=new Person(102,21,"abc");
		Person p2=new Person(102,21,"dcb");
		Person p3=new Person(102,21,"ddb");
		
		sp.add(p1);
		sp.add(p2);
		sp.add(p3);
		System.out.println(sp);
	}
}

实现类:
//继承Comparable接口,实现CompareTo()方法
//这里是泛型,一定要制定具体数据类型,否则CompareTO()方法没法实现
public class Person implements Comparable<Person>{

	private int id;
	private int age;
	private String name;
	public Person(int id, int age, String name) {
		super();
		this.id = id;
		this.age = age;
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}


	@Override
	public String toString() {
		return "Person [id=" + id + ", age=" + age + ", name=" + name + "]";
	}


	/**
	 * 自定义比较器规则:
	 * 首先根据学号进行比较,学号小的在前面
	 * 学号一样的话(假设有学号一样),根据年龄比较,年龄小的在前面
	 * 年龄也一样的话根据姓名的ASCII比较
	 */
	@Override
	public int compareTo(Person o) {
		//先比较学号
		int value=0;
		value=this.id-o.id;
		//学号一样比较年龄
		if(value==0) {
			value=this.age-o.age;
			if(value==0) {
				//年龄也一样比较name,注意:这里字符串比较一定要判断字符串是否为null
				if(this.name!=null&&o.name!=null) {
					value=this.name.compareTo(o.name);
				}
			}
		}
		return value;
	}
}

输出:根据name排序 
      [Person [id=102, age=21, name=abc],
	   Person [id=102, age=21, name=dcb], 
	   Person [id=102, age=21, name=ddb]]
第二种:Comparator接口实现
测试类:

import java.util.ArrayList;
import java.util.List;
public class TreeSetText {

	public static void main(String[] args) {
		
		List<Emp> eList=new ArrayList<Emp>();
		eList.add(new Emp(1,23));
		eList.add(new Emp(1,21));
		eList.add(new Emp(1,18));
		Collections.sort(eList, new EmpComparator());
		System.out.println(eList);
	}
}

初始化对象类

//自制比较器,功能和之前的Compareable一样,另种写法
public class Emp {
	private int id;
	private int age;
	
	
	@Override
	public String toString() {
		return "Emp [id=" + id + ", age=" + age + "]";
	}
	public Emp(int id, int age) {
		super();
		this.id = id;
		this.age = age;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

实现类:

import java.util.Comparator;

public class EmpComparator implements Comparator<Emp> {
	
	@Override
	public int compare(Emp o1, Emp o2) {
		int val=o1.getId()-o2.getId();
		if(val==0) {
			val=o1.getAge()-o2.getAge();
		}
		return val;
	}
}


发布了36 篇原创文章 · 获赞 50 · 访问量 9766

猜你喜欢

转载自blog.csdn.net/qq_41765969/article/details/89680951