赞
踩
集合排序,它可以使用集合的工具类java.util.Collections
其定义了很多静态方法,用于操作集合,其中sort方法是对list集合进行自然排序(从小到大)。
public class Collections_sort { public static void main(String[] args) { //随机生成生成10个100内的整数存储在list集合中 List<Integer> list=new ArrayList<Integer>(); for(int i=0;i<10;i++){ int a=(int)(Math.random()*100); list.add(a); } System.out.println(list); //进行集合排序 Collections.sort(list); System.out.println("排序后的"+list); } }
[25, 41, 87, 9, 33, 43, 94, 78, 92, 32]
排序后的[9, 25, 32, 33, 41, 43, 78, 87, 92, 94]
sort方法要求集合元素必须实现Comparable接口,
Collections的sort方法具有侵入性,所谓侵入性是指当我们使用某个功能时,该功能要求我们修改代码,修改的越多侵入性越强,一旦不需要该功能,这个改动就没有意思了,在实际并发中是不推荐使用的。
实现comparable接口,要求必须重写该方法,那么他的意思是定义当前对象与参数。
public class Pointer implements Comparable<Pointer>{ private int x; private int y; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } @Override public String toString() { return "Pointer [x=" + x + ", y=" + y + "]"; } public Pointer(int x, int y) { super(); this.x = x; this.y = y; } public int compareTo(Pointer o) { int len=this.x*this.x+this.y*this.y; int olen=o.x*o.x+o.y*o.y; return len-olen; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + x; result = prime * result + y; return result; } public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Pointer other = (Pointer) obj; if (x != other.x) return false; if (y != other.y) return false; return true; } }
public class Collections_sort2 { public static void main(String[] args) { List<Pointer> list=new ArrayList<Pointer>(); list.add(new Pointer(2,3)); list.add(new Pointer(1,4)); list.add(new Pointer(0,5)); list.add(new Pointer(8,9)); list.add(new Pointer(7,6)); list.add(new Pointer(1,5)); list.add(new Pointer(6,8)); System.out.println(list); Collections.sort(list); System.out.println("排序后的list为"+list); } }
[Pointer [x=2, y=3], Pointer [x=1, y=4], Pointer [x=0, y=5], Pointer [x=8, y=9], Pointer [x=7, y=6], Pointer [x=1, y=5], Pointer [x=6, y=8]]
排序后的list为[Pointer [x=2, y=3], Pointer [x=1, y=4], Pointer [x=0, y=5], Pointer [x=1, y=5], Pointer [x=7, y=6], Pointer [x=6, y=8], Pointer [x=8, y=9]]
对对象的排序后的顺序取决于自定义类重写后compareTo(Pointer o)方法,我们可以按照自己的意愿对这个比较方法自行定义,缺点就是侵入性强。
推荐的集合排序方式: 当遇到排序自定义类型元素或者集合元素自身的比较规则不满足时都建议使用下面的方式排序,该sort方法要求额外传来一个比较器,并按照比较器规则比较集合元素并进行排序,因此该排序方法不要求集合元素实现comparable接口。
public class Collections_sort3 { public static void main(String[] args) { List<String> list=new ArrayList<String>(); list.add("小马"); list.add("小超超"); list.add("小陈泽与"); list.add("沃德四级啊"); Comparator<String> cp=new Comparator<String>() { public int compare(String o1, String o2) { int a=o1.length(); int b=o2.length(); return a-b; } }; Collections.sort(list, cp); System.out.println("排序后的结果:"+list); } }
排序后的结果:[小马, 小超超, 小陈泽与, 沃德四级啊]
比较器使用更加简便,不用实现comparable接口,更能满足使用者的需求。
public class Collections_sort4 { public static void main(String[] args) { List<Pointer> list=new ArrayList<Pointer>(); list.add(new Pointer(2,3)); list.add(new Pointer(1,4)); list.add(new Pointer(0,5)); list.add(new Pointer(8,9)); list.add(new Pointer(7,6)); list.add(new Pointer(1,5)); list.add(new Pointer(6,8)); //使用Comparator比较器对集合排序 Comparator<Pointer> oop=new Comparator<Pointer>() { public int compare(Pointer o1, Pointer o2) { int a=o1.getX()+o1.getY(); int b=o2.getX()+o2.getY(); return a-b; } }; Collections.sort(list, oop); System.out.println("排序后的list是"+list); } }
排序后的list是[Pointer [x=2, y=3], Pointer [x=1, y=4], Pointer [x=0, y=5], Pointer [x=1, y=5], Pointer [x=7, y=6], Pointer [x=6, y=8], Pointer [x=8, y=9]]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。