叙述Collections.sort方法

Sort方法是Collections类中的一个静态方法,
有两种使用方式

方式一是Collections.sort(List);

	ArrayList<String> strs=  new ArrayList<String>();
			strs.add("hjk");
			strs.add("bcd");
			//添加元素
	          for(String str:strs){
				System.out.println(str);
			}
		Collections.sort(strs);//排序

参数是List类型,直接传入一个指定数据类型的List集合,Collections中的sort方法方法体是list.sort(null);,
null会告诉List中的sort方法并没有给一个Comparator,在sort方法中将传进来的集合用toArrays()方法转换为Object数组
将对象数组传进Arrays.sort中利用Arrays中的sort(Object[] a);
调用ComparableTimSort类中的sort方法和binarySort方法来对数组进行排序,
(多态)

在ComparableTimSort类中的binarySort方法创建了Comparable接口类型的变量pivot,
(将Object类型(在例子中转的是String类型)强转成Comparable类型,子类(String类)的对象送给长辈(Comparable)的引用,)

利用这个变量if (pivot.compareTo(a[mid]) < 0)回调compareTo方法
(长辈的引用打点调长辈的方法)

按照给定数据类型的规则直接进行集合元素的排序
前提是这个数据类型实现了Comparable接口,并重写了compareTo方法,
例子中的String类已经实现了Comparable接口,并重写了compareTo方法,其中的排序规则制定好了,但只能制定一种规则.
当然,这在其他数据类型中要想这样,也是一样的方法,
即, 实现了 Comparable接口, 并重写 了compareTo方法,但也是 只能制定一种规则.

方式二Collections.sort(List,Comparator);

   public List<Teacher> getTeacher(){
   		List<Teacher> teas=new ArrayList<Teacher>();
   		Teacher tea1=new Teacher("zhangsan",20,10000);
   		Teacher tea2=new Teacher("lisi",25,10500);
   		Teacher tea3=new Teacher("王五",22,18000);
   		
   		teas.add(tea1);
   		teas.add(tea2);
   		teas.add(tea3);
   		return teas;
   	}
   
   public void sortAge(List<Teacher> teas){
   		Collections.sort(teas,new Comparator<Teacher>(){
   			//按年龄排序的策略实现
   			@Override
   			public int compare(Teacher o1, Teacher o2) {
   				int value = o1.getAge()-o2.getAge();
   				return value;
   			}
   			
   		} );
   	}

多态:

ArrayList继承了List 创建对象teas调ArrayList重写add方法添加集合元素,
sortAge方法的参数是List类型的参数,
在Collections的类中sort()方法是调用了list接口中的sort()方法,用长辈类的
引用teas打点调长辈类的sort方法(以Comparator作为方法的参数),
底层用Comparator的参数对象回调了compare方法,所以要求重写compare方法
实现了Comparator接口的匿名的子类对象,重写了Comparator的compare方法

匿名内部类:

实现了Comparator接口的匿名的子类对象,重写了Comparator的compare方法,

回调:

TimSort这个类其中的binarySort方法中Comparator的参数对象c
if (c.compare(pivot, a[mid]) < 0)调用的是重写后的compare方法对集合进行排序

策略:

sort方法的参数有两个,一个是要排序的list数据,
另一个参数是比较器接口Comparator接口,
在此比较器中执行要排序的原则,使用比较器的方式就不用对要比较的集合中的元素类型实现Comparable接口
可以实现多个比较器,每个比较器对应一种排序原则,每次重写compare方法都是一种策略,
对数据类型不做限制,制定规则,只要重写compare方法就可以

需要注意的是:
参数的类型是List集合,
Set集合需要转成List集合,(for循环遍历)
Map集合根据需求将key用keySet()转成List集合,或将value利用values()转成List集合

因为在Collections的类中sort()方法是调用了list接口中的sort()方法,
但其中往里传的Comparator接口的匿名内部类对象(这里制定了排序的规则),
这样list接口调用的Arrays.sort方法就会接收到匿名内部类对象和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值