Java 中使用 sort() 方法排序:从基本原理到多种用法全面总结;sort()函数的使用

总结整理不易,如果对你有所帮助,不妨动手点个免费的赞哦,收藏关注不迷路[比心]~

目录

1. sort() 函数的基本原理

2. sort() 函数的用法

2.1 默认排序(升序)

2.2 局部排序

2.2 降序排序(逆序排序)

2.2.1 使用Collections.reverseOrder()方法进行逆序排序

2.2.2 使用Comparator.reversed()方法

2.2.3 匿名内部类

2.2.4 使用Lambda表达式进行逆序排序

2.3 自定义对象进行排序

2.4 Lambda 表达式简化Comparator的实现

2.4.1 基本的Lambda表达式

2.4.2 省略类型定义:

2.4.3 使用静态方法引用:

2.4.4 使用实例方法引用:

2.5 多级排序

2.6 并行排序



在 Java 编程中,sort() 函数是一个非常重要且常用的方法,用于对数组或集合进行排序操作。本文将深入探讨 sort() 函数的基本原理、以及其在实际应用中的多种用法。

1. sort() 函数的基本原理

Java中的sort()函数是一个高效的排序算法,其具体的实现原理取决于排序的数据类型和大小。在Java 7之前,Arrays类使用的是经典的快速排序算法。在Java 7及以后的版本中,Arrays类在排序小型数组时使用的是改进后的快速排序算法,而在排序大型数组时使用的是归并排序算法。

原理详情请看往期:一文让你深入理解java中sort() 方法的底层原理,Collections.sort,Arrays.sort_java sort的底层原理-CSDN博客

2. sort() 函数的用法

在 Java 中,sort() 函数可以用于对数组或集合进行排序,其用法略有不同。

2.1 默认排序(升序)

格式:

Arrays.sort(array);
Collections.sort(list);

 例:

//对整型数组进行排序
int[] array = {5, 2, 9, 1, 3};
Arrays.sort(array);
System.out.println(Arrays.toString(array)); //输出:[1, 2, 3, 5, 9]
​
//对字符串数组进行排序
String[] names = {"John", "Alice", "Bob", "David"};
Arrays.sort(names);
System.out.println(Arrays.toString(names)); //输出:[Alice, Bob, David, John]
​
// 对列表进行排序
List<Integer> list = new ArrayList<>();
list.add(5);
list.add(2);
list.add(9);
list.add(1);
list.add(3);
Collections.sort(list);
System.out.println(list); // 输出:[1, 2, 3, 5, 9]

2.2 局部排序

格式:

Arrays.sort(数组名,start,end);//注意左闭右开!!![start,end)

例: 

int[] array = {5, 2, 9, 1, 3};
//对数组的一部分内容进行排序(索引从1到4,包括1不包括4)
Arrays.sort(array, 1, 4);
System.out.println(Arrays.toString(array)); //输出:[5, 1, 2, 9, 3]

2.2 降序排序(逆序排序)

有时我们需要对数组或集合进行倒序排序,可以通过自定义比较器实现:

2.2.1 使用Collections.reverseOrder()方法进行逆序排序

//数组:
Integer[] arr = {3, 1, 4, 1, 5, 9};
Arrays.sort(arr, Collections.reverseOrder());// 输出:[9, 5, 4, 3, 1, 1]

Collections.sort(list, nameComparator.reversed());

//集合:
List<Integer> list = Arrays.asList(3, 1, 4, 1, 5, 9);
Collections.sort(list, Collections.reverseOrder());
System.out.println(list);  // 输出:[9, 5, 4, 3, 1, 1]

2.2.2 使用Comparator.reversed()方法

List<Student> list = Student.getStudentList();
Comparator<Student> nameComparator = (s1, s2) -> s1.getName().compareTo(s2.getName());
Collections.sort(list, nameComparator.reversed());

2.2.3 匿名内部类

Integer[] arr = {8, 9, 5, 2, 3, 6, 1, 0, 7, 4};
Arrays.sort(arr, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 - o2;
    }
});

2.2.4 使用Lambda表达式进行逆序排序

Integer[] arr = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5};
Arrays.sort(arr, (o1, o2) -> o2 - o1);

2.3 自定义对象进行排序

//数组自定义对象排序
Person[] people = {new Person("Alice", 25), new Person("Bob", 20), new Person("Charlie", 30)};
Comparator<Person> byName = Comparator.comparing(Person::getName);//注:Person 类中需有getName()方法
Arrays.sort(people, byName); //按照姓名排序
​
// 集合自定义对象排序
List<Person> persons = new ArrayList<>();
persons.add(new Person("Alice", 25));
persons.add(new Person("Bob", 30));
persons.add(new Person("David", 20));
Comparator<Person> byName = Comparator.comparing(Person::getName);
Collections.sort(persons, byName); // 使用 Collections.sort() 对 List 进行排序

//匿名内部类
public static List<People> compareTest(List<People> arr) {
    Collections.sort(arr, new Comparator<People>() {
        public int compare(People p1, People p2) {
            int a = p1.age; //比较的是age
            int b = p2.age;
            return a < b ? -1 : a == b ? 0 : 1; //当a<b返回-1,a==b返回0,a>b返回1
        }
    });

2.4 Lambda 表达式简化Comparator的实现

自从 Java 8 引入了 Lambda 表达式,我们可以更加简洁地定义比较器:

2.4.1 基本的Lambda表达式

Comparator<Developer> byName = (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName());

这里,我们创建了一个Comparator来比较两个Developer对象的名字。

2.4.2 省略类型定义:

humans.sort((h1, h2) -> h1.getName().compareTo(h2.getName()));

在这个例子中,我们不需要指定h1和h2的类型,编译器会自动推断。

2.4.3 使用静态方法引用:

humans.sort(Human::compareByNameThenAge);

在这里我们使用了Human类的静态方法compareByNameThenAge作为Comparator。

2.4.4 使用实例方法引用:

Collections.sort(humans, Comparator.comparing(Human::getName));

2.5 多级排序

List<Developer> listDevs = getDevelopers();
Comparator<Developer> comparator = Comparator.comparing(Developer::getAge)
                                              .thenComparing(Developer::getName);
listDevs.sort(comparator);

2.6 并行排序

Java 8引入了并行排序。如果你有一个非常大的数组,你可以使用Arrays.parallelSort()方法进行排序。这个方法会利用多核处理器的优势,将数组分成多个部分,然后并行地对每个部分进行排序,最后再将结果合并起来。

//例1:
int[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
Arrays.parallelSort(arr);
System.out.println(Arrays.toString(arr));  // 输出:[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

//例2
List<Integer> list = new ArrayList<>();
// 添加大量数据到列表中
list = list.parallelStream().sorted().collect(Collectors.toList());

### 回答1: JS报uncaught syntaxerror: unexpected token <错误通常是因为在HTML页面中引入JS脚本的链接出现了问题。这个错误提示显示出了JS脚本引入的标签遭遇了一个不期望的"<"符号。 解决这个问题的方法是检查HTML页面中引用的JS脚本链接是否正确且完整。可以使用浏览器开发者工具找到报错的具体行号,并检查该行的链接是否正确。如果链接正确,可以尝试将JS代码复制到一个单独的JS文件中,然后再通过链接方式引用。如果仍然存在错误,可能是JS代码本身的问题,需要检查JS代码语法和逻辑是否正确。如果仍然无法解决问题,建议寻求更专业的技术支持或寻找更多相关教程和资料进行学习。 ### 回答2: 在使用JavaScript开发网站时,我们常常会遇到“Uncaught SyntaxError: Unexpected token <”这个错误。这个错误通常出现在我们的JavaScript代码中出现了“<”符号。这个符号在HTML代码中被广泛使用来表示标签的开头,但在JavaScript代码中,这个符号是一个特殊的字符,它表示字符串或表达式的小于(比较)运算符。因此,当我们在JavaScript代码中使用了“<”符号时,浏览器会认为这是一个意外的符号,从而引发了这个错误。 解决这个错误的方法有以下几种: 1. 检查JavaScript代码是否正确:首先,我们应该检查我们的JavaScript代码是否有任何语法错误或拼写错误。这通常可以通过使用浏览器的控制台来完成,控制台会显示JavaScript代码中的错误信息和行号。 2. 使用转义字符:如果我们必须在JavaScript代码中使用“<”符号,我们可以使用转义字符“\”来转义它。例如,我们可以使用“<”符号代替“\<”符号。 3. 将JavaScript代码放在正确的位置:有时,当我们将JavaScript代码放在错误的位置时,例如在HTML标签中间或在<script>标签之外,浏览器会将其解释为HTML代码,从而引发这个错误。因此,我们应该确保我们的JavaScript代码放在正确的位置,例如在<script>标签内或外部的JavaScript文件中。 4. 检查文件路径:在引用外部JavaScript文件时,我们应该确保文件路径是正确的。如果文件路径不正确,浏览器将无法加载JavaScript文件,从而导致这个错误。 5. 确保服务器已正确配置:如果我们的网站使用了服务器端脚本语言(例如PHP或ASP),我们应该确保服务器已正确配置,以便正确解释JavaScript代码。否则,浏览器将尝试在客户端解释服务器端的JavaScript代码,并引发这个错误。 总之,我们可以通过检查代码的语法及结构、使用转义字符、放置代码的位置和检查文件路径以及确保服务器已正确配置等方法来解决JavaScript中的“Uncaught SyntaxError: Unexpected token <”错误。 ### 回答3: JS在页面中报错时,返回的错误信息通常都很晦涩难懂,容易让人不知所措。uncaught syntaxerror: unexpected token <错误通常表示代码语法错误,通常是由于代码中缺少某个符号或引号、拼写错误等原因导致的。 首先,检查代码中是否有缺省的分号、括号、引号等未闭合。这些都是常见的语法错误,检查并及时修复可以大大缩短解决问题的时间。 其次,如果确定代码本身没有问题,则需要检查引入的外部文件,例如CSS、JS等文件。如果其中有文件错误,那么可能会导致JS也无法正常执行,所以要对所有文件进行检查。 另外,如果代码中使用了特殊字符、HTML标签等,也可能会引发这种错误。此时可以将这些内容用escape()函数进行转义处理,避免出现这种错误。 最后,可以使用开发者工具中的console.log()对代码进行逐行调试,定位出错误出现的位置。这种方法比较耗时,但可以有效地解决问题。 总之,解决uncaught syntaxerror: unexpected token <错误需要耐心,仔细地检查代码,尝试各种可能的解决方法。同时,建议平时写代码时注意细节,避免出现常见的语法错误。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值