集合工具类的使用以及自定义排序规则

一、集合工具类

java.util.Arrays类:包含对数组的操作方法。如排序,复制,二分搜索等。

java.util.Collections类:包含对集合的操作方法。以下为几种常用的方法:

集合工具类的使用以及自定义排序规则_第1张图片

 

二、以下是对比较器Comparable接口和Comparator接口的赘述

1.Comparable接口(内部比较器)

众所周知,TreeSet和TreeMap能够对放入的元素自动排序,Collection.sort()方法也能如此。那如果我们向集合中放入一个自定义的Person类的类对象,会怎么样呢?将会报如下的错误。意思是说Perosn类的对象不能被转为Comparable实例对象,显然,TreeSet不知道怎么给你这样的类对象排序。

class com.myz.test.Person cannot be cast to class java.lang.Comparable 

那为什么TreeSet等能知道怎么给Integert类型或是String类型排序呢?因为Integer等类型已经实现了Comparable接口并定义好了相应的比较规则。

因此,要想让集合支持排序,就要让其中的元素所在的类实现comparable接口并重写compareTo方法

class Person implements Comparable{
	public int age;
	public String Name;
	public int score;
	public Person(int age, String name,int score) {
		super();
		this.age = age;
		this.Name = name;
		this.score=score;
	}
	@Override
	public int compareTo(Person o) {
		// TODO Auto-generated method stub
		
		//如果返回0,则加入新元素的时候,会被认为是相同的元素,想不被舍去则返回一个正数或负数
//		if(o.age==this.age) return 1;
		
		return o.age-this.age;//按照年龄降序,this-o为升序,o-this为降序
	}
public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		TreeSet s = new TreeSet();
		s.add(new Person(15, "关羽",67));
		s.add(new Person(34,"张飞",69));
		s.add(new Person(21,"刘备",73));
		
		
		for(Person p:s) {
			System.out.println("age:"+p.age+" name:"+p.Name);//按年龄降序打印
		}
	}

按年龄降序,如果年龄相同,则按分数升序

        @Override
	public int compareTo(Person o) {
		// TODO Auto-generated method stub
		if(o.age==this.age) {
			return this.score-o.score;//分数升序
		}
		return o.age-this.age;//按照年龄降序,this-o为升序,o-this为降序
	}

 

2.Comparator接口(外部比较器)

那么问题来了,如果放入的是Integer类型(默认是升序排列),而我想要降序排列,怎么办?

显然,修改Integer类源码里的Compareto方法是不可能的,只能通过外部传入一个比较器,让它按新的比较器重新比较。

//自定义一个外部比较器
class IntegerComparator implements Comparator{

	@Override
	public int compare(Integer o1, Integer o2) {
		// TODO Auto-generated method stub
		return o2-o1;
	}
	
}
                TreeSet s = new TreeSet(new IntegerComparator());
		s.add(10);
		s.add(15);
		s.add(16);
				
		System.out.println(s);//16,15,10

匿名类对象方式

                TreeSet s = new TreeSet(new Comparator() {

			@Override
			public int compare(Integer o1, Integer o2) {
				// TODO Auto-generated method stub
				return o2-o2;
			}
		});
		s.add(10);
		s.add(15);
		s.add(16);
				
		System.out.println(s);//16,15,10

lambda表达式方式

                TreeSet s = new TreeSet((o1,o2)->o2-o1);
		s.add(15);
		s.add(14);
		s.add(20);
		System.out.println(s);//[20, 15, 14]
		
		List list = Arrays.asList(10,34,36,45);
		Collections.sort(list, (o1,o2)->o2-o1);
		System.out.println(list);//[45, 36, 34, 10]

 

你可能感兴趣的:(你模糊的java基础)