8.3集合类Collections

1Collections

collections封装了对collection以及下面的子类处理方法

该类提供了一些很方便的方法,如在查找,排序元素等。
该类的方法都是静态的


1.1排序

栗子:

	public static void main(String[] args){
		//
		List list = new ArrayList();
		//往list中放元素,这个方法也可以为其他的集合类放元素如set
		//该类的方法都是static的,可以直接用类名调用
		Collections.addAll(list, "asd","fff","asd","dde","jjh");
		
		//排序(自然顺序)
		Collections.sort(list);
		//反向排序
		Collections.reverse(list);
	}

1.2对象排序

可以让对象类实现他的比较器Comparable<T>

栗子:

Student类

/*
 * 实现Comparable,
 * 注意的是里面的泛型必须是与list的相同
 * */
class Student implements Comparable<Student>{
	int number;	//学号
	String name;//名字
	int height;//身高
	
	//构造方法
	public Student(int number, String name, int height) {
		super();
		this.number = number;
		this.name = name;
		this.height = height;
	}

	
	//覆盖接口的方法
	//如果对象
	//返回值为于1就按正序排,返回值为-1就反着排,为0就相等
	@Override
	public int compareTo(Student s) {
		//先按学号排
		//用自己(this)的学号和s的学好比,如果大于,返回1的话就正着排,返回-1的话就会反着排
		if(this.number>s.number){
			return 1;					
		}else if(this.number<s.number){
			return -1;
		}else{
			return 0;
		}
	}

	
	//toString
	@Override
	public String toString() {
		return "Student [number=" + number + ", name=" + name + ", height=" + height + "]";
	}
}
main入口:     
		//
		List<Student> list = new ArrayList<Student>();
		list.add(new Student(1, "八戒", 180));
		list.add(new Student(3, "悟空", 99999));
		list.add(new Student(2, "沙僧", 185));
		list.add(new Student(9, "师傅", 180));
		
		//排序对象,该对象类实现它的比较器Comparable,并继承comparaTo()方法
		Collections.sort(list);
		
		//遍历list
		for(Student s:list){
			System.out.println(s);
		}
	}
输出结果是:

Student [number=1, name=八戒, height=180]
Student [number=2, name=沙僧, height=185]
Student [number=3, name=悟空, height=99999]
Student [number=9, name=师傅, height=180]


如果将this和对象比会大于返回的值为-1话,就会倒着排

修改了下Student类中覆盖的方法compareTo(T)方法,将this.number > s.number的返回值换成了-1,这样就会倒着排

	//覆盖接口的方法
	//如果对象
	//返回值为于1就按正序排,返回值为-1就反着排,为0就相等
	@Override
	public int compareTo(Student s) {
		//先按学号排
		//用自己(this)的学号和s的学好比,如果大于,返回1的话就正着排,返回-1的话就会反着排
		if(this.number>s.number){
			return -1;					
		}else if(this.number<s.number){
			return 1;
		}else{
			return 0;
		}
	}
输出结果:

Student [number=9, name=师傅, height=180]
Student [number=3, name=悟空, height=99999]
Student [number=2, name=沙僧, height=185]
Student [number=1, name=八戒, height=180]


如果要按名字来排呢

看栗子:再次修改Student类中覆盖的方法compareTo(T)方法

	public int compareTo(Student s) {
		//按名字来排序
		//String类实现了这个Comparable这个接,所以可以直接用调用这个方法来给String类型的排序(是anUnicode的值)
		return this.name.compareTo(s.name);
	}


1.3按不同的类型排序

这样做有个缺点,如果我下次要按身高来排序的话,有要跑到这个Studen类的内部来修改,修改内部类是有风险的

所以,sort()方法可以传入一个Comparetor类型的参数来达到选折不同的排序方式

看例子:1,student类不用再实现Comparble接口

/*
 * 实现Comparable,
 * 注意的是里面的泛型必须是与list的相同
 * */
class Student{
	int number;	//学号
	String name;//名字
	int height;//身高
	
	//构造方法
	public Student(int number, String name, int height) {
		super();
		this.number = number;
		this.name = name;
		this.height = height;
	}
	
	//toString
	@Override
	public String toString() {
		return "Student [number=" + number + ", name=" + name + ", height=" + height + "]";
	}
}
2,写一个类实现Comparator接口

/*
 * 写一个类继承Comparator接口,实现其方法
 * */
class MyComparable implements Comparator<Student>{

	@Override
	public int compare(Student o1, Student o2) {
		return o1.height>o2.height?1:(o1.height<o2.height)?-1:0;//三目运算判断
	}
}
3mian:sort()方法中传入一个Comparator类型的参数

		//排序对象,该对象类实现它的比较器Comparator
		Collections.sort(list,new MyComparable());
输出结果:

Student [number=1, name=八戒, height=180]
Student [number=9, name=师傅, height=180]
Student [number=2, name=沙僧, height=185]
Student [number=3, name=悟空, height=99999]

这就回按身高来排序了,如果还要实现像按年龄,班级排序等,就可以在写类实现Comparator比较器,然后再参入这个比较器,就不用再去类的内部修改代码



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值