集合的排序
java.util.Collections类
Collections是集合的工具类,里面定义了很多静态方法用于操作集合.
java.util.Collections类是Java集合框架中的一个工具类,提供了一系列静态方法来操作集合对象。它包含了各种方法,如排序、查找、更改集合中的元素等。
以下是一些常用的方法:
-
sort(List<T> list): 对列表进行排序,使用默认的自然顺序。
-
binarySearch(List<T> list, T key): 在指定的列表中进行二分查找,返回指定元素的索引。
-
reverse(List<T> list): 反转指定列表中元素的顺序。
-
shuffle(List<T> list): 随机重排指定列表中的元素。
-
replaceAll(List<T> list, T oldVal, T newVal): 将列表中等于指定值的所有元素替换为新值。
-
rotate(List<T> list, int distance): 将列表中的所有元素向右移动指定距离,超出列表末尾的元素将被放置在列表的开头。
-
max(Collection<?> coll): 返回指定集合中的最大元素,根据自然顺序。
-
min(Collection<?> coll): 返回指定集合中的最小元素,根据自然顺序。
-
frequency(Collection<?> coll, Object o): 返回指定集合中等于指定对象的元素个数。
-
emptyList(): 返回一个不可修改的空列表。
-
singletonList(T o): 返回一个只包含指定对象的不可修改的列表。
可以通过Collections类来简化对集合的操作,提高代码的简洁性和可读性。它是一个非常强大的工具类,为我们在处理集合数据时提供了很多便捷的方法。
Collections.sort(List list)方法
可以对List集合进行自然排序(从小到大)
代码示例:
package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;/*** 集合的排序* 集合的工具类:java.util.Collections提供了一个静态方法sort,可以对List集合* 进行自然排序*/
public class SortListDemo1 {public static void main(String[] args) {List<Integer> list = new ArrayList<>();Random random = new Random();for(int i=0;i<10;i++){list.add(random.nextInt(100));}System.out.println(list);Collections.sort(list);System.out.println(list);}
}
排序自定义类型元素
代码示例
package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** 排序自定义类型元素*/
public class SortListDemo2 {public static void main(String[] args) {List<Point> list = new ArrayList<>();list.add(new Point(1,2));list.add(new Point(97,88));list.add(new Point(7,6));list.add(new Point(9,9));list.add(new Point(5,4));list.add(new Point(2,3));System.out.println(list);/*编译不通过的原因:Collections.sort(List list)该方法要求集合中的元素类型必须实现接口:Comparable,该接口中有一个抽象方法compareTo,这个方法用来定义元素之间比较大小的规则.所以只有实现了该接口的元素才能利用这个方法比较出大小进而实现排序操作.*/Collections.sort(list);//编译不通过 compare比较 comparable可以比较的System.out.println(list);}
}
实际开发中,我们并不会让我们自己定义的类(如果该类作为集合元素使用)去实现Comparable接口,因为这对我们的程序有**侵入性**.
侵入性:当我们调用某个API功能时,其要求我们为其修改其他额外的代码,这个现象就是侵入性.侵入性越强的API越不利于程序的后期可维护性.应当尽量避免.
重载的Collections.sort(List list,Comparator c)方法
代码示例
package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;/*** 排序自定义类型元素*/
public class SortListDemo2 {public static void main(String[] args) {List<Point> list = new ArrayList<>();list.add(new Point(1,2));list.add(new Point(97,88));list.add(new Point(7,6));list.add(new Point(9,9));list.add(new Point(5,4));list.add(new Point(2,3));System.out.println(list);/*Collections.sort(List list)在排序List集合时要求集合元素必须实现了Comparable接口。实现了该接口的类必须重写一个方法compareTo用与定义比较大小的规则,从而进行元素间的比较后排序。否则编译不通过。侵入性:当我们调用某个API时,其反过来要求我们为其修改其他额外的代码,这种现象就成为侵入性。侵入性不利于程序后期的维护,尽可能避免。compare:比较*/
// Collections.sort(list);//匿名内部类的形式创建一个比较器Comparator<Point> com = new Comparator<Point>() {@Override/*** 实现比较器接口后必须重写方法compare.* 该方法用来定义参数o1与参数o2的比较大小规则* 返回值用来表示o1与o2的大小关系*/public int compare(Point o1, Point o2) {int len1 = o1.getX() * o1.getX() + o1.getY() * o1.getY();int len2 = o2.getX() * o2.getX() + o2.getY() * o2.getY();return len1-len2;}};Collections.sort(list,com);//回调模式System.out.println(list);}
}
最终没有侵入性的写法
代码示例
package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;/*** 排序自定义类型元素*/
public class SortListDemo2 {public static void main(String[] args) {List<Point> list = new ArrayList<>();list.add(new Point(1,2));list.add(new Point(97,88));list.add(new Point(7,6));list.add(new Point(9,9));list.add(new Point(5,4));list.add(new Point(2,3));System.out.println(list);/*Collections.sort(List list)在排序List集合时要求集合元素必须实现了Comparable接口。实现了该接口的类必须重写一个方法compareTo用与定义比较大小的规则,从而进行元素间的比较后排序。否则编译不通过。侵入性:当我们调用某个API时,其反过来要求我们为其修改其他额外的代码,这种现象就称为侵入性。侵入性不利于程序后期的维护,尽可能避免。compare:比较*/
// Collections.sort(list);//匿名内部类的形式创建一个比较器
// Comparator<Point> com = new Comparator<Point>() {
// @Override
// /**
// * 实现比较器接口后必须重写方法compare.
// * 该方法用来定义参数o1与参数o2的比较大小规则
// * 返回值用来表示o1与o2的大小关系
// */
// public int compare(Point o1, Point o2) {
// int len1 = o1.getX() * o1.getX() + o1.getY() * o1.getY();
// int len2 = o2.getX() * o2.getX() + o2.getY() * o2.getY();
// return len1-len2;
// }
// };
// Collections.sort(list,com);//回调模式// Collections.sort(list,new Comparator<Point>() {
// public int compare(Point o1, Point o2) {
// int len1 = o1.getX() * o1.getX() + o1.getY() * o1.getY();
// int len2 = o2.getX() * o2.getX() + o2.getY() * o2.getY();
// return len1-len2;
// }
// });Collections.sort(list,(o1,o2)->o1.getX() * o1.getX() + o1.getY() * o1.getY() -o2.getX() * o2.getX() - o2.getY() * o2.getY());System.out.println(list);}
}```##### 排序字符串java中提供的类,如:String,包装类都实现了Comparable接口,但有时候这些比较规则不能满足我们的排序需求时,同样可以临时提供一种比较规则来进行排序.```java
package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class SortListDemo3 {public static void main(String[] args) {List<String> list = new ArrayList<>();
// list.add("Tom");
// list.add("jackson");
// list.add("rose");
// list.add("jill");
// list.add("ada");
// list.add("hanmeimei");
// list.add("lilei");
// list.add("hongtaoliu");
// list.add("Jerry");list.add("传奇");list.add("小泽老师");list.add("苍老师");System.out.println(list);//按照字符多少排序
// Collections.sort(list);
// Collections.sort(list, new Comparator<String>() {
// public int compare(String o1, String o2) {return o1.length()-o2.length();
// return o2.length()-o1.length();//反过来减就是降序
// }
// });Collections.sort(list,(o1,o2)->o2.length()-o1.length());System.out.println(list);}
}
总结:
1. Comparable接口和Comparator接口:这两个接口是Java中用于定义对象比较规则的关键。实现Comparable接口的对象可以直接使用Collections.sort()方法来排序,而实现Comparator接口的比较器对象可以用于对集合进行自定义排序。
2. 对List集合进行排序:可以使用Collections.sort()方法对List集合进行排序,也可以使用自定义的Comparator来实现特定的排序规则。
3. 对数组进行排序:使用Arrays.sort()方法可以对数组进行排序,该方法使用了快速排序算法来实现高效的排序。
4. 对Map集合进行排序:通常对Map集合进行排序是指对其中的键或值进行排序,可以将键或值转换为List,然后对List进行排序。
5. 对自定义对象进行排序:如果集合中存储的是自定义对象,可以让对象实现Comparable接口来定义默认的比较规则,也可以使用Comparator来定义自定义的排序规则。
6. 排序算法:Java中的排序方法通常使用了快速排序、归并排序等高效的排序算法,这些算法能够在大多数情况下提供较好的性能。