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

一、集合工具类

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

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

 

二、以下是对比较器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<Person>{
	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<Person> 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<Integer>{

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

匿名类对象方式

                TreeSet<Integer> s = new TreeSet(new Comparator<Integer>() {

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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值