Collections工具类的sort方法

Collections是一个工具类
例如比较常用的Arrays类就是一个工具类,它在java.util.Arrays包中,提供了很多操作数组的各种静态方法.
Collections工具类在java.util.Collections包中,用来操作Collection对象,也是java集合框架中的一员.

它拥有一个sort()方法


关于comparable待会再介绍,先用sort()实现简单的排序功能,下面这个案例是给Integer泛型的list排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * @author lune
 * 
 * 通过Collections.sort()方法,对Integer泛型的List进行排序
 * 对String泛型的List进行排序
 */
public class CollectionsTest {
	
	/**
	 * 对Integer泛型的List进行排序
	 * 创建一个Integer泛型的List,插入十个100以内不重复的随机整数
	 */
	public void sortInterger(){
		List<Integer> integerList = new ArrayList<Integer>();
		Random random = new Random();
		Integer integer;
		for(int i = 0 ; i<10 ; i++){
			do{
				integer = random.nextInt(100);
			}while(integerList.contains(integer));      //如果包含此整数,则重新生成
			integerList.add(integer);
			System.out.println("添加了整数"+integer);
		}
		System.out.println("--------------排序前---------------");
		for(Integer in:integerList){
			System.out.print(in+"  ");
		}
		System.out.println("\n\n");
		Collections.sort(integerList);
		System.out.println("--------------排序后---------------");
		for(Integer in:integerList){
			System.out.print(in+"  ");
		}
		
	}

	
	public static void main(String[] args) {
		new CollectionsTest().sortInterger();

	}

}
在贴出一个小作业
仍然是在慕课学习时老师布置的小练习,String是按字符的ASCII码逐个比较排序的

下面贴出我自己的代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * @author lune
 *
 */
public class SortDemo {
	
	static List<String> stringList;
	
	/**
	 * 向stringList中添加十条长度在10以内的随机字符串
	 */
	public void test(){
		stringList = new ArrayList<String>();
		Random random = new Random();
		String str = null;
		for(int i=0 ; i<10 ; i++){
			int length = random.nextInt(10);              //生成随机长度
			do{
				str = createRandomString(length);
			}while(stringList.contains(str));            //若包含相同的字符串,则重新生成字符串
			
			System.out.println("将要添加的字符串:"+str);
			stringList.add(str);
		}
		System.out.println("--------------排序前---------------");
		show();
		Collections.sort(stringList);
		System.out.println("--------------排序后---------------");
		show();
	}
	
	/**
	 * 该方法生成一个长度为length随机字符串
	 */
	public String createRandomString(int length){
		String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		//根据base的长度获取随机数,将这个随机数作为base的下标
		Random random = new Random();
		StringBuffer sb = new StringBuffer();
		for(int i=0 ; i<length ;i++){
			int index = random.nextInt(base.length());
			sb.append(base.charAt(index));
		}
		return sb.toString();
		
	}
	
	//显示stringList
	public void show(){
		for(String str:stringList){
			System.out.println(str);
		}
	}

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new SortDemo().test();
	}

}

下面是运行结果:


到这里,大家是否觉得困惑,既然只是对Integer,String进行排序,那为什么不直接用一个数组,然后用Arrays工具类中的sort()方法直接排序呢?那么请思考这个问题,如果有一个Teacher类,含有id和name属性,那么如何根据id或者name对List<Teacher>排序呢?
下面就要来谈谈上面没说的comparable接口(可比较).

排序,实际上可以看作是一个比较的过程,例如对整数排序,对大小比较,然后按一定顺序排列。那么对于Teacher对象,既有id,又有name.假如List<Teacher>中有很多Teacher对象,系统并不能确定集合中的元素是否能进行比较,并且系统如何知道要以哪一种标准去比较所有的对象呢?

对于基本包装类以及String类型,都实现了Comparable接口.对于Integer,因为数值大小的不同,就可以说Integer是可以比较的.很显然,如果两个事物要进行排序,首先它们必须是可以比较的,而比较通常是指这两个事物在某一方面或者某几方面的特性可比较.

如果两个学生,升高不同,体重也不同,那么给他们进行排序时就必须说明,是按身高排序,还是按体重排序.


对于sort()排序的集合中的对象都必须实现Comparable接口.那么理所当然,如果要对Teacher泛型集合进行排序,Teacher类必须实现Comparable接口,相当于给对象指定了默认的排序规则,必须实现该接口的compareTo()方法,当两个实现了Comparable接口的类的实例进行比较时,就会调用compareTo()方法.
如果A对象compareTo B对象,返回正数表示A对象比B对象大,负数表示小,0表示相等.

public class Teacher implements Comparable<Teacher>{
	public String id;
	public String name;
	
	public Teacher(String id , String name){
		this.id = id;
		this.name = name;
	}

	@Override
	public int compareTo(Teacher o) {
		
		return this.id.compareTo(o.id);
	}	
}
Comparable<T>指定该类的实例会和泛型T的实例进行比较,由于这里是两个Teacher对象比较,则指定T为Teacher.其中由于id是String类型实现了Comparable接口,因此只需要返回id的比较结果.
下面测试一下:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * @author lune
 *
 */
public class SortTeacher {
	public void test(){
		List<Teacher> teachers = new ArrayList<Teacher>();
		teachers.add(new Teacher("2", "wang"));
		teachers.add(new Teacher("3", "cheng"));
		teachers.add(new Teacher("1", "li"));
		Collections.sort(teachers);
		for(Teacher t:teachers){
			System.out.println(t.id+t.name);
		}
	}
	public static void main(String[] args) {
		new SortTeacher().test();

	}

}
大功告成,实际上还有一个Comparator接口,它定义的是临时比较规则,而不是默认比较规则.接口的实现类必须实现compare()方法.有兴趣的可以在API中学习一下.




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值