2.定义一个Person类。属性有: 定义一个Book类; 属性有: 书名、 价格。 要求用Comparable接口实现, 使用TreeSet<Person>集合存储, 排序规则: A.先按照收入从高到低排序; B.收入相等的情况下, 按照年龄从小到大排序; C.如果收入和年龄都相等, 按照姓名排序, 字典顺序(String类的compareTo方法); D.如果以上3个属性都相等, 按照书排序, 先按照书价格从低到高, 如果书价格相等, 按照书名(字典顺序)。 3.利用自定义比较器Comparator实现类完成第2题。
时间: 2023-06-15 07:04:50 浏览: 127
2. Person类和Book类的定义如下:
```java
public class Person implements Comparable<Person> {
private String name;
private int age;
private double income;
private Book book;
// 构造方法、setter和getter方法省略
@Override
public int compareTo(Person o) {
if (this.income > o.income) {
return -1;
} else if (this.income < o.income) {
return 1;
} else {
if (this.age < o.age) {
return -1;
} else if (this.age > o.age) {
return 1;
} else {
int nameCompare = this.name.compareTo(o.name);
if (nameCompare != 0) {
return nameCompare;
} else {
if (this.book.getPrice() < o.book.getPrice()) {
return -1;
} else if (this.book.getPrice() > o.book.getPrice()) {
return 1;
} else {
return this.book.getName().compareTo(o.book.getName());
}
}
}
}
}
}
public class Book {
private String name;
private double price;
// 构造方法、setter和getter方法省略
}
```
使用TreeSet存储Person对象,并调用Collections.sort方法进行排序:
```java
TreeSet<Person> set = new TreeSet<>();
set.add(new Person("Tom", 20, 5000.0, new Book("Java", 50.0)));
set.add(new Person("Alice", 25, 6000.0, new Book("Python", 60.0)));
set.add(new Person("Bob", 20, 5000.0, new Book("C++", 40.0)));
set.add(new Person("Alice", 25, 6000.0, new Book("Java", 70.0)));
List<Person> list = new ArrayList<>(set);
Collections.sort(list);
for (Person p : list) {
System.out.println(p.getName() + " " + p.getAge() + " " + p.getIncome() + " " + p.getBook().getName() + " " + p.getBook().getPrice());
}
```
输出结果为:
```
Alice 25 6000.0 Java 70.0
Alice 25 6000.0 Python 60.0
Tom 20 5000.0 Java 50.0
Bob 20 5000.0 C++ 40.0
```
3. 自定义比较器Comparator实现类的定义如下:
```java
public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
if (o1.getIncome() > o2.getIncome()) {
return -1;
} else if (o1.getIncome() < o2.getIncome()) {
return 1;
} else {
if (o1.getAge() < o2.getAge()) {
return -1;
} else if (o1.getAge() > o2.getAge()) {
return 1;
} else {
int nameCompare = o1.getName().compareTo(o2.getName());
if (nameCompare != 0) {
return nameCompare;
} else {
if (o1.getBook().getPrice() < o2.getBook().getPrice()) {
return -1;
} else if (o1.getBook().getPrice() > o2.getBook().getPrice()) {
return 1;
} else {
return o1.getBook().getName().compareTo(o2.getBook().getName());
}
}
}
}
}
}
```
使用TreeSet存储Person对象,并传入自定义比较器进行排序:
```java
TreeSet<Person> set = new TreeSet<>(new PersonComparator());
set.add(new Person("Tom", 20, 5000.0, new Book("Java", 50.0)));
set.add(new Person("Alice", 25, 6000.0, new Book("Python", 60.0)));
set.add(new Person("Bob", 20, 5000.0, new Book("C++", 40.0)));
set.add(new Person("Alice", 25, 6000.0, new Book("Java", 70.0)));
for (Person p : set) {
System.out.println(p.getName() + " " + p.getAge() + " " + p.getIncome() + " " + p.getBook().getName() + " " + p.getBook().getPrice());
}
```
输出结果与上一题相同。注意,使用自定义比较器时不需要实现Comparable接口。
阅读全文