一、使用comparator排序步骤
- 创建Comparator对象
- 实现compare方法
- 使用Comparator进行排序
二、第一步:创建comparator对象
comparator是一个接口,必须交给类来实现。
接口无法被实例化,但是可以被实现。
实际用法
Comparator<T> comparator = new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
// 在这里定义对象比较的规则
}
};
当你使用new Comparator<Integer>() { ... }
创建一个匿名内部类时,实际上是在创建一个实现了Comparator接口的匿名类的实例。这种方式可以方便地定义并实例化一个实现了Comparator接口的对象,并且可以在其中实现compare方法来自定义排序逻辑。
这种方式通常用于在使用一次性的比较逻辑时,不需要为比较逻辑创建一个独立的类。匿名内部类可以直接在需要的地方实例化,比较灵活和简洁。这样的实现通常用在只需要一次性使用的简单逻辑的情况下。
三、第二步:实现comparator方法
Comparator<T> comparator = new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
// 比较o1和o2的大小
if (o1 < o2) {
return -1; // 返回负整数,表示o1小于o2
} else if (o1 > o2) {
return 1; // 返回正整数,表示o1大于o2
} else {
return 0; // 返回零,表示o1等于o2
}
}
};
compare方法比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
实际使用:身高体重排序
有一群人需要列队,首先按照身高排序;若身高相同,体重轻的在前面;若身高体重均相同,则维持原有的位置。
public int compare(Integer i1, Integer i2) {
if (heights[i1] != heights[i2]) {
return heights[i1] - heights[i2]; // 按照身高升序排列
【如果i1的身高小于i2的身高,这个值为负数,则i1小于i2,以此类推完成i1和i2的比较】
} else if (weights[i1] != weights[i2]) {
return weights[i1] - weights[i2]; // 若身高相同,按照体重升序排列
【如果i1的体重小于i2的体重,这个值为负数,则第一个i1小于i2;】
} else {
return ids[i1] - ids[i2]; // 若身高和体重都相同,维持原有的编号顺序
【如果都相同,就不管谁id大,谁就大】
}
}
四、第三步、使用comparator排序
实际使用代码
在完成Comparator对象的创建和compare方法的实现后,就可以使用Comparator进行排序了。下面是使用Comparator进行排序的代码示例:
List<T> list = new ArrayList<>(); // 添加要排序的对象到list中
Collections.sort(list, comparator);
在上述代码中,我们使用Collections.sort方法对list进行排序,第一个参数是要排序的list,第二个参数是Comparator对象。
实例:身高体重排序
Integer[] indices = new Integer[n];
for (int i = 0; i < n; i++) {
indices[i] = i;
}
//匿名内部类的实例对象
Arrays.sort(indices, new Comparator<Integer>() {
public int compare(Integer i1, Integer i2) {
if (heights[i1] != heights[i2]) {
return heights[i1] - heights[i2]; // 按照身高升序排列
} else if (weights[i1] != weights[i2]) {
return weights[i1] - weights[i2]; // 若身高相同,按照体重升序排列
} else {
return ids[i1] - ids[i2]; // 若身高和体重都相同,维持原有的编号顺序
}
}
});
相关知识:在哪里使用sort
在 Java 中,
sort
方法可以用于以下几种集合类:
- List 接口的实现类:比如 ArrayList、LinkedList
- 数组:可以使用 java.util.Arrays 类中的静态 sort 方法对数组进行排序
- 队列:比如 PriorityQueue
- 其他实现了 Collection 接口的类,但要求元素具有比较性,例如 TreeSet
需要注意的是,对于自定义的对象进行排序,对象需要实现 Comparable 接口或者提供 Comparator 接口的实现。否则,对于一些没有自然顺序的对象,sort 方法可能会抛出 ClassCastException 异常。
Arrays.Sort()
五、其他:字串排序
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;public class Main {
public static void main(String[] args) {
// 待排序的字符串数组
String[] strings = {"apple", "zebra", "banana", "orange"};// 使用自定义规则进行排序
Arrays.sort(strings, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
// 定义每个字母的数值映射
Map<Character, Integer> charValues = new HashMap<>();
charValues.put('a', 1);
charValues.put('b', 2);
charValues.put('c', 3);
charValues.put('d', 4);
charValues.put('e', 5);
// ... 其他字母的数值映射// 计算字符串的总值
int value1 = 0;
for (char c : s1.toCharArray()) {
value1 += charValues.getOrDefault(c, 0);
}int value2 = 0;
for (char c : s2.toCharArray()) {
value2 += charValues.getOrDefault(c, 0);
}// 如果数值相同,则按照字母的自然顺序来排序
if (value1 == value2) {
return s1.compareTo(s2);
}
// 否则按照数值排序
return Integer.compare(value1, value2);
}
});// 打印排序后的字符串数组
for (String str : strings) {
System.out.print(str + " ");
}
}
}