Arrays.sort可以对所有实现Comparable的对象进行排序。但如果有多种排序需求,如有时候需对name进行降序排序,有时候只需要对年龄进行排序。使用Comparable无法满足这样的需求。可以编写不同的Comparator
来满足多样的排序需求。
1.编写PersonSortable2类
属性:private name(String)
、private age(int)
有参构造函数:参数为name,age
toString方法:返回格式name-age
2 编写Comparator类
- 编写
NameComparator
类,实现对name进行升序排序 - 编写
AgeComparator
类,对age进行升序排序
3.main方法中
- 输入n
- 输入n行name age,并创建n个对象放入数组
- 对数组按照name进行升序排序后输出。
- 在3的基础上对数组按照age进行升序排序后输出。
- 最后最后两行使用如下代码输出NameComparator与AgeComparator所实现的所有接口。
System.out.println(Arrays.toString(NameComparator.class.getInterfaces()));
System.out.println(Arrays.toString(AgeComparator.class.getInterfaces()));
输入样例:
5
zhang 15
zhang 12
wang 14
Wang 17
li 17
输出样例:
NameComparator:sort
Wang-17
li-17
wang-14
zhang-15
zhang-12
AgeComparator:sort
zhang-12
wang-14
zhang-15
Wang-17
li-17
//最后两行是标识信息
java">import java.util.Arrays; // 用于使用Arrays.sort()方法进行数组排序
import java.util.Scanner; // 用于从输入流中读取不同类型的数据
import java.util.Comparator; // Comparator类在这里面,用于创建比较器// 创建PersonSortable2类
class PersonSortable2 {private String name; // 定义私有属性nameprivate int age; // 定义私有属性age//根据题意定义了一个有参构造方法,无返回值不要加voidpublic PersonSortable2(String name, int age) {this.age = age; // 使用this关键字将形参age赋值给成员变量agethis.name = name; // 使用this关键字将形参name赋值给成员变量name}// 自动生成的Getter和Setter方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 重写toString()方法@Overridepublic String toString() {return this.name + "-" + this.age;}
}// 创建NameComparator类实现Comparator接口
//implements Comparator<T>;中T为比较对象的类型
class NameComparator implements Comparator<PersonSortable2> {public int compare(PersonSortable2 o1, PersonSortable2 o2) {int result = o1.getName().compareTo(o2.getName()); // 使用compareTo()方法比较字符串类型name;return result;}
}// 创建AgeComparator类实现Comparator接口
class AgeComparator implements Comparator<PersonSortable2> {public int compare(PersonSortable2 o1, PersonSortable2 o2) {if (o1.getAge() > o2.getAge()) {return 1;} else if (o1.getAge() < o2.getAge()) {return -1;} else {return 0;}}
}public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // 从输入流中读取一个整数nPersonSortable2[] personSortable2s = new PersonSortable2[n]; // 创建一个长度为n的PersonSortable2数组int age;String name;for (int i = 0; i < n; i++) {name = sc.next(); // 从输入流中读取一个字符串nameage = sc.nextInt(); // 从输入流中读取一个整数agepersonSortable2s[i] = new PersonSortable2(name, age); // 创建一个PersonSortable2对象并将其存储在数组中,即实例化;}System.out.println("NameComparator:sort");Arrays.sort(personSortable2s, new NameComparator()); // 使用NameComparator比较器对数组进行排序for (int i = 0; i < personSortable2s.length; i++) {System.out.println(personSortable2s[i].toString()); // 打印排序后的数组元素}System.out.println("AgeComparator:sort");//println();输出内容后换行Arrays.sort(personSortable2s, new AgeComparator()); // 使用AgeComparator比较器对数组进行排序for (int i = 0; i < personSortable2s.length; i++) {System.out.println(personSortable2s[i].toString()); // 打印排序后的数组元素}System.out.println(Arrays.toString(NameComparator.class.getInterfaces())); // 打印NameComparator类实现的接口System.out.println(Arrays.toString(AgeComparator.class.getInterfaces())); // 打印AgeComparator类实现的接口}
}