Sort自定义排序
在java以及Javascript当中都存在sort自定义排序问题,本章将详细解释如何自定义排序规则
根据自定义函数返回值确定排序规则:
- 如果 返回值为True(返回值 > 0),a,b交换位置,`a` 排在 `b` 前面。
- 如果 返回值等于 0,`a` 和 `b` 顺序不变。
- 如果 返回值为False(返回值 < 0),a,b位置不变,`a` 排在 `b` 后面。
Js实现自定义排序
在 JavaScript 中,自定义排序规则是通过 Array.prototype.sort()
方法的回调函数实现的。
数组自定义排序
数组使用sort()
函数进行排序
默认情况下,sort()函数会对数组进行升序排序
let arr2 = [5, 2, 1, -10, 8];arr2.sort()console.log(arr2); // 8, 5, 2, 1, -10
当我们需要自定义排序规则,需要在sort()传入一个回调函数,用于自定义排序规则。
回调函数callback(a,b)
:
-
如果 返回值为True(返回值 > 0),a,b交换位置,
a
排在b
前面。 -
如果 返回值等于 0,
a
和b
顺序不变。 -
如果 返回值为False(返回值 < 0),a,b位置不变,
a
排在b
后面。
let arr = [5, 2, 1, -10, 8];// 使用自定义排序规则:升序arr.sort((a, b) => a - b); // 如果我们要升序排列即a<b, 且只有当a-b时sort()内回调函数返回值为负数,a和b的位置不变。因此回调函数返回值为a-bconsole.log(arr); // [-10, 1, 2, 5, 8]// 使用自定义排序规则:降序arr.sort((a, b) => b - a); // 我们需要降序排序,则a>b,当b-a时sort()内回调函数返回值为负数,a和b位置不变,因此回调函数返回值为b-aconsole.log(arr); // [8, 5, 2, 1, -10]
对象自定义排序
let people = [{ name: "Alice", age: 30 },{ name: "Bob", age: 25 },{ name: "Charlie", age: 35 },];// 按年龄升序排序people.sort((a, b) => a.age - b.age);console.log(people);// [// { name: 'Bob', age: 25 },// { name: 'Alice', age: 30 },// { name: 'Charlie', age: 35 }// ]
Java实现自定义排序
在 Java 中,`compare` 函数主要由以下两种方式提供:
`Comparator.compare(T o1, T o2)` **返回值**:
- `负值`:表示 `o1` 排在 `o2` 前面。
- `0`:表示 `o1` 和 `o2` 的顺序不变(视为相等)。
- `正值`:表示 `o1` 排在 `o2` 后面。
数组自定义排序
对整数数组进行降序排序
import java.util.Arrays;import java.util.Comparator;public class CustomSort {public static void main(String[] args) {Integer[] arr = {5, 2, 1, -10, 8};// 使用 Comparator 定义降序排序规则Arrays.sort(arr, new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {return b - a; // 降序}});// 输出排序后的数组System.out.println(Arrays.toString(arr)); // [8, 5, 2, 1, -10]}}
数组的降序排序
import java.util.Arrays;public class CustomSort {public static void main(String[] args) {Integer[] arr = {5, 2, 1, -10, 8};// 使用 Lambda 表达式定义降序排序规则Arrays.sort(arr, (a, b) -> b - a);System.out.println(Arrays.toString(arr)); // [8, 5, 2, 1, -10]}}
对象自定义排序
对一个 Person
类的对象列表按照年龄升序排序
import java.util.*;class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return name + " (" + age + ")";}}public class CustomSort {public static void main(String[] args) {List<Person> people = new ArrayList<>();people.add(new Person("Alice", 30));people.add(new Person("Bob", 25));people.add(new Person("Charlie", 35));// 按照年龄升序排序people.sort(new Comparator<Person>() {@Overridepublic int compare(Person p1, Person p2) {return Integer.compare(p1.age, p2.age);}});System.out.println(people); // [Bob (25), Alice (30), Charlie (35)]}}
对象列表排序
import java.util.*;class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return name + " (" + age + ")";}}public class CustomSort {public static void main(String[] args) {List<Person> people = new ArrayList<>();people.add(new Person("Alice", 30));people.add(new Person("Bob", 25));people.add(new Person("Charlie", 35));// 按年龄升序排序people.sort((p1, p2) -> Integer.compare(p1.age, p2.age));System.out.println(people); // [Bob (25), Alice (30), Charlie (35)]}}
总结
对比总结:Java 与 JavaScript 的自定义排序
特性 | Java | JavaScript |
---|---|---|
排序方法 | Arrays.sort / List.sort | Array.prototype.sort |
自定义规则实现方式 | Comparator 接口 或 Lambda 表达式 | 排序函数(compareFunction ) |
支持对象排序 | 使用 Comparator 针对属性排序 | 排序函数中通过对象属性定义排序逻辑 |
多条件排序 | 使用嵌套 compare 或链式条件判断 | 使用多个 if 或排序权重逻辑 |
主要区别 | 更强类型约束;适合大规模集合的排序 | 灵活、动态,无需显式声明类型 |
两种语言的自定义排序机制都很灵活,但 Java 偏重于类型安全和面向对象,而 JavaScript 更加动态和简洁。