Java集合Collections和元素排序之Comparable排序接口讲解
了解了集合工具类Collections的sort()方法的默认排序规则后,我们可以进一步探讨和拓展这个主题:
问题1:为什么默认排序时大写字母会排在小写字母前面?
这是因为默认情况下,String类型的比较是基于字符的Unicode值。大写字母的Unicode码值在小写字母之前。例如,'A'的Unicode码值是65,而'a'的Unicode码值是97。所以当你混合使用大小写字母时,会发现大写的字母会排在最前面。
举个例子,如果你有一段代码类似:
`java
list.add("Apple");
list.add("banana");
list.add("Cherry");
Collections.sort(list);
`
排序后的结果会是:"Apple", "Cherry", "banana"。这是因为'A'(65)和'C'(67)比'b'(98)要小。这种默认的排序逻辑可能会让刚开始学习的同学感到困惑,但了解了背后的原理后就能理解了。
问题2:如何实现自定义排序规则,比如按字符串长度排序呢?
这时候就可以使用Comparator接口。我们可以自定义一个Comparator,在比较两个字符串时,按照它们的长度来进行排序。例如:
`java
Collections.sort(list, new Comparator
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
`
这样就能按照字符串长度从短到长的顺序排序。如果想反过来,把长的排前面,只需要反过来比较即可。
问题3:排序时遇到数字字符,会怎样处理?
比如说字符串中有"100"、"20"、"3"这样的元素,直接Collections.sort(list)的话,结果会是"100", "20", "3",这是因为String比较是逐个字符比较的,而不是看作数字来比较。这时候如果想按数字大小排序,就需要自定义Comparator,将字符串转换成Integer进行比较。
学习这些排序规则后,你是不是已经迫不及待想自己动手尝试这些代码了?别急,把这些概念弄清楚后,再结合具体的业务需求,你就能轻松应对各种排序场景了!
Collections工具类: Java里关于集合的工具类,包含有各种有关集合操作的静态多态方法,不能实例化(把构造函数私有化) 。
和Collection的区别 : Collection是接口,提供了对集合对象进行基本操作的通用接口方法,List、Set等多种具体的实现类。Collections是工具类,专门操作Collection接口实现类里面的元素。
常用方法: 排序 sort(List list)
按自然排序的升序排序
可见, 默认排序后是按字母升序输出。
package Demo_1;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class SortTest {public static void main(String[] args) {sortTest();}public static void sortTest() {List<String> list = new ArrayList<>();list.add("aaa");list.add("yyy");list.add("mmm");list.add("ddd");System.out.println("排序前:" + " " + list);Collections.sort(list);System.out.println("排序后:" + " " + list);
当数组里包括大小写,排序输出结果为先排大写,再排小写。
package Demo_1;public class SortTest {public static void main(String[] args) {sortTest();}public static void sortTest() {List<String> list = new ArrayList<>();list.add("AAA");list.add("yyy");list.add("MMM");list.add("ddd");System.out.println("排序前:" + " " + list);Collections.sort(list);System.out.println("排序后:" + " " + list);
默认是升序,等于Collections.sort(list), Collections.sort(list, Comparator.naturalOrder())
降序: Collections.sort(list,Comparator.reverseOrder());
//默认升序Collections.sort