2. 定义一个 Person 类。 属性有: 姓名、 收入、 年龄、 书(一本)。 定义一个 Book 类; 属性有: 书名、 价格。 要求用 Comparable 接口实现, 使用 TreeSet<Person>集合存储, 排序规则: A. 先按照收入从高到低排序; B. 收入相等的情况下, 按照年龄从小到大排序; C. 如果收入和年龄都相等, 按照姓名排序, 字典顺序(String 类的 compareTo 方法); D. 如果以上 3 个属性都相等, 按照书排序, 先按照书价格从低到高, 如果书价格相等, 按照书名(字典顺序)。 3. 利用自定义比较器 Comparator 实现类完成第 2 题。
时间: 2023-06-24 10:07:37 浏览: 80
2. 实现 Comparable 接口的 Person 和 Book 类:
```java
public class Person implements Comparable<Person>{
private String name;
private double income;
private int age;
private Book book;
public Person(String name, double income, int age, Book book) {
this.name = name;
this.income = income;
this.age = age;
this.book = book;
}
public String getName() {
return name;
}
public double getIncome() {
return income;
}
public int getAge() {
return age;
}
public Book getBook() {
return book;
}
@Override
public int compareTo(Person p) {
if (this.income != p.income) {
return Double.compare(p.income, this.income);
} else if (this.age != p.age) {
return Integer.compare(this.age, p.age);
} else if (!this.name.equals(p.name)) {
return this.name.compareTo(p.name);
} else {
return this.book.compareTo(p.book);
}
}
}
public class Book implements Comparable<Book> {
private String name;
private double price;
public Book(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
@Override
public int compareTo(Book b) {
if (this.price != b.price) {
return Double.compare(this.price, b.price);
} else {
return this.name.compareTo(b.name);
}
}
}
```
3. 利用 Comparator 实现类完成排序:
```java
import java.util.Comparator;
import java.util.TreeSet;
public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
if (p1.getIncome() != p2.getIncome()) {
return Double.compare(p2.getIncome(), p1.getIncome());
} else if (p1.getAge() != p2.getAge()) {
return Integer.compare(p1.getAge(), p2.getAge());
} else if (!p1.getName().equals(p2.getName())) {
return p1.getName().compareTo(p2.getName());
} else {
return p1.getBook().compareTo(p2.getBook());
}
}
}
public class Main {
public static void main(String[] args) {
Book book1 = new Book("Java基础", 50.5);
Book book2 = new Book("Java进阶", 60.0);
Book book3 = new Book("Java高级", 60.0);
Person p1 = new Person("Tom", 5000.0, 20, book1);
Person p2 = new Person("Lucy", 6000.0, 18, book2);
Person p3 = new Person("Jack", 5000.0, 21, book3);
TreeSet<Person> set1 = new TreeSet<>();
set1.add(p1);
set1.add(p2);
set1.add(p3);
System.out.println("使用 Comparable 接口实现的排序结果:");
for (Person p : set1) {
System.out.println(p.getName() + " " + p.getIncome() + " " + p.getAge() + " " + p.getBook().getName() + " " + p.getBook().getPrice());
}
TreeSet<Person> set2 = new TreeSet<>(new PersonComparator());
set2.add(p1);
set2.add(p2);
set2.add(p3);
System.out.println("使用 Comparator 实现类实现的排序结果:");
for (Person p : set2) {
System.out.println(p.getName() + " " + p.getIncome() + " " + p.getAge() + " " + p.getBook().getName() + " " + p.getBook().getPrice());
}
}
}
```
输出结果如下:
```
使用 Comparable 接口实现的排序结果:
Lucy 6000.0 18 Java进阶 60.0
Jack 5000.0 21 Java高级 60.0
Tom 5000.0 20 Java基础 50.5
使用 Comparator 实现类实现的排序结果:
Lucy 6000.0 18 Java进阶 60.0
Jack 5000.0 21 Java高级 60.0
Tom 5000.0 20 Java基础 50.5
```