目录
原理
Comparator接口是用于定义对象之间的比较规则的。当我们调用Arrays.sort方法时,它会根据提供的比较器(Comparator)来判断对象的顺序,从而实现自定义的排序功能。通过重写Comparator接口中的compare方法,我们可以指定对象之间的比较方式。
示例实现了什么?
首先传入了要排序的国家的数量
根据传入的数量进行循环输入,金牌、银牌、铜牌的数量用空格隔开
最后按照奖牌数量降序输出每个国家的金牌、银牌和铜牌数量。
首先演示一个外部类实现比较器方式
具体就是创建一个
package Test;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入国家数量:");
int countryCount = scanner.nextInt();
List<Country> countries = new ArrayList<>();
for (int i = 0; i < countryCount; i++) {
System.out.print("请输入第 " + (i + 1) + " 个国家的奖牌数量(金牌 银牌 铜牌):");
int gold = scanner.nextInt();
int silver = scanner.nextInt();
int bronze = scanner.nextInt();
countries.add(new Country(gold, silver, bronze));
}
CountryComparator comparator = new CountryComparator();
countries.sort(comparator);
for (Country country : countries) {
System.out.println(country.gold + " " + country.silver + " " + country.bronze);
}
}
}
class Country {
int gold;
int silver;
int bronze;
public Country(int gold, int silver, int bronze) {
this.gold = gold;
this.silver = silver;
this.bronze = bronze;
}
}
class CountryComparator implements Comparator<Country> {
@Override
public int compare(Country c1, Country c2) {
if (c1.gold != c2.gold) {
return c2.gold - c1.gold; // 金牌数量降序排序
} else if (c1.silver != c2.silver) {
return c2.silver - c1.silver; // 银牌数量降序排序
} else {
return c2.bronze - c1.bronze; // 铜牌数量降序排序
}
}
}
外部类的写法就是创造一个外部的比较器类,去实现这个Comparator<填入要排序的类>接口。
对compare方法进行重写,写出排序的逻辑
在主函数中new出这个比较器类的实例,然后将这个new出的实例填入到sort(比较器类实例)的参数中,用列表调用sort方法进行排序即可
匿名内部类写法
package Test;
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入国家数量:");
int countryCount = scanner.nextInt();
List<Country> countries = new ArrayList<>();
for (int i = 0; i < countryCount; i++) {
System.out.print("请输入第 " + (i + 1) + " 个国家的奖牌数量(金牌 银牌 铜牌):");
int gold = scanner.nextInt();
int silver = scanner.nextInt();
int bronze = scanner.nextInt();
countries.add(new Country(gold, silver, bronze));
}
// countries.sort(countries, new Comparator<Country>() {
// @Override
// public int compare(Country c1, Country c2) {
// if (c1.gold != c2.gold) {
// return c2.gold - c1.gold; // 金牌数量降序排序
// } else if (c1.silver != c2.silver) {
// return c2.silver - c1.silver; // 银牌数量降序排序
// } else {
// return c2.bronze - c1.bronze; // 铜牌数量降序排序
// }
// }
// });
countries.sort((c1, c2) -> {
if (c1.gold != c2.gold) {
return c2.gold - c1.gold; // 金牌数量降序排序
} else if (c1.silver != c2.silver) {
return c2.silver - c1.silver; // 银牌数量降序排序
} else {
return c2.bronze - c1.bronze; // 铜牌数量降序排序
}
});
for (Country country : countries) {
System.out.println(country.gold + " " + country.silver + " " + country.bronze);
}
}
static class Country {
int gold;
int silver;
int bronze;
public Country(int gold, int silver, int bronze) {
this.gold = gold;
this.silver = silver;
this.bronze = bronze;
}
}
}
直接让List对象countries调用sort方法——sort(countries, new Comparator<Country>() {}),第一个参数传入要排序的对象,第二个参数new Comparator接口,重写其中的compare方法,实现排序
文章介绍了如何使用Java的Comparator接口来实现自定义排序。通过创建外部类或使用匿名内部类重写compare方法,可以按特定规则(如金牌、银牌、铜牌数量降序)对国家的奖牌进行排序。示例代码展示了这两种方法的具体实现。
&spm=1001.2101.3001.5002&articleId=131906720&d=1&t=3&u=b4e5f51570ac4c178a106d44bac4db8a)
643

被折叠的 条评论
为什么被折叠?



