List集合排序的两种方法

List集合排序主要涉及到两个接口Comparable接口和Comparator接口以及一个方法Collections.sort()的使用

首先是Comparable接口的自然排序

先来看一个例子:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<Integer> list=new ArrayList<>();
		list.add(123);
		list.add(155);
		list.add(35);
		list.add(90);
		System.out.println(list);
		Collections.sort(list);
		System.out.println(list);
	}

输出结果:
在这里插入图片描述
这个自然排序就是从小到大顺序排列,包括数字顺序,字母顺序等;

再看list集合加入相对复杂的对象排序

public class Employee implements Comparable<Employee>{
	private String name;
	private int age;
	private double salary;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	
	public Employee(String name, int age, double salary) {
		super();
		this.name = name;
		this.age = age;
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "Employee [name=" + name + ", age=" + age + ", salary=" + salary + "]\n";
	}
	@Override
	public int compareTo(Employee o) {
		if (salary==o.getSalary()) { //当salary相等时,比较age
			if (age==o.getAge()) {  //age相等时,比较姓名
			//String类中自己重写了compareTo()方法,调用即可
				return name.compareTo(o.getName()); 
			}else {
				return o.getAge()-age;
			} 
		}else {
		 //salary不相等,返回值从小到大排列	
			return (int) (o.getSalary()-salary);
		}
	}
	
}
public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<Employee> list =new ArrayList<Employee>();
		list.add(new Employee("张三",21 , 58.0));
		list.add(new Employee("张三",21 , 58.0));
		list.add(new Employee("李四",31 , 88.0));
		list.add(new Employee("王五",11 , 28.0));
		list.add(new Employee("赵六",11 , 28.0));
		list.add(new Employee("赵六",18 , 58.0));
		  Collections.sort(list); //调用sort方法
		System.out.println(list);
}

输出结果:
在这里插入图片描述
在这里我们会发现必须要实现 Comparable接口并且重写compareTo()方法,在compareTo()方法中写自定义的排序规则,总结一条返回值负数都表示小于,正数都表示大于,0表示等于,同时,在遇到字符串时,String类中本身就重写了compareTo()方法,调用即可,同时这个排序因为是运用list集合不会去除重复项用Collections.sort(list);调用比较方法;

Comparator配合set集合使用

set集合使用相对于list,最大的不同就是可以去重,接下来看一个案例

// Employee对象中写法不变

public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<Employee> list =new ArrayList<Employee>();
		list.add(new Employee("张三",21 , 58.0));
		list.add(new Employee("张三",21 , 58.0));
		list.add(new Employee("李四",31 , 88.0));
		list.add(new Employee("王五",11 , 28.0));
		list.add(new Employee("赵六",11 , 28.0));
		list.add(new Employee("赵六",18 , 58.0));
		System.out.println("=======================================");
		TreeSet<Employee> treeSet=new TreeSet<>();
		treeSet.addAll(list);
		for(Employee e:treeSet) {
			System.out.println(e);
		}
		}

输出结果为:
在这里插入图片描述
set集合使用Comparable接口规则和list没有什么不同,注意两点即可,1,set会自己调用compareTo()方法,而list需要Collections.sort(list);调用比较方法。2,set会去除重复项。

Comparator的临时排序

来看一个例子。

public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<Employee> list =new ArrayList<Employee>();
		list.add(new Employee("张三",21 , 58.0));
		list.add(new Employee("张三",21 , 58.0));
		list.add(new Employee("李四",31 , 88.0));
		list.add(new Employee("王五",11 , 28.0));
		list.add(new Employee("赵六",11 , 28.0));
		list.add(new Employee("赵六",18 , 58.0));
			Collections.sort(list,new Comparator<Employee>() {
			@Override
			public int compare(Employee o1, Employee o2) {
				if (o1.getSalary()==o1.getSalary()) {
					if (o1.getAge()==o2.getAge()) {
						return o2.getName().compareTo(o1.getName());
					}else {
						return o2.getAge()-o1.getAge();
					}
				}else {
					return (int) (o2.getSalary()-o1.getSalary());
				}
			}
		});
		System.out.println(list);

输出结果:
在这里插入图片描述
这个在调用Collections.sort()方法时实现Comparator接口,并且重写compare()方法,compare方法中的比较排序规则与前面相同。

笔者作为一个新人,翻看和欣赏了大神的笔记后,自己总结加工,发表一下自己浅薄的见解,如果哪里说得不对,希望读者能提出批评和指正,本人表示诚心的感谢。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值