题目:
封装一个人类,属性姓名,收入,年龄,书,
封装一个书类:属性书名,价格
存储TreeSet<Person>集合,排序规则:
A:先按照收入排序:从高到低
B:收入相等的情况下,按照年龄排序:从小大大
C:如果收入和年龄都相等,按照姓名排序,字典顺序(String 类的
compareTo 方法)
D:如果以上3 个属性都相等,按照书排序,先按照书价格:从低到高,
如果书价格相等,按照书名(字典顺序)。
4、利用自定义比较器完成上题。(使用匿名内部类)
第一种
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class CrossGift {
public static void main(String[] args) {
Person p1=new Person("lisi", 122, 25, "javase1", 12); //创建对象
Person p2=new Person("zhangsna", 122, 23, "javase1", 12);
Person p3=new Person("lisi", 122, 23, "javase2", 12);
Person p4=new Person("lisi", 122, 23, "javase1", 12);
Person p5=new Person("lisi", 122, 23, "javase2", 15);
Person p6=new Person("lisi", 123, 22, "javase3", 13);
TreeSet<Person> ts = new TreeSet<>(new Comparator<Person>() {//创建TreeSet同时匿名内部类传入比较器
@Override
public int compare(Person p1, Person p2) {//比较,可调整 p1比p2还是p2比p1改变排序方式.
return (p2.sal - p1.sal != 0 ? p2.sal - p1.sal
: p1.age - p2.age != 0 ? p1.age - p2.age
: p1.name.compareTo(p2.name) != 0 ? p1.name.compareTo(p2.name)
: p1.book.price - p2.book.price != 0 ? p1.book.price - p2.book.price
: p1.book.name.compareTo(p2.book.name)!=0? p1.book.name.compareTo(p2.book.name):1 );
}
}); //开存
ts.add(p1);
ts.add(p2);
ts.add(p3);
ts.add(p4);
ts.add(p5);
ts.add(p6);
ts.add(p1);
Iterator<Person> it=ts.iterator();//用迭代器取出,看排序
while (it.hasNext())
System.out.println(it.next().toString());
}
}
class Person {
String name;
int sal;
int age;
Book book;
public Person(String name,int sal,int age,String bookname,int bookprice) {
this.name=name;
this.sal=sal;
this.age=age;
this.book=new Book(bookname,bookprice);
}
public String toString(){//覆盖Object的toString()方法用于查看输出/
return("name:"+name+"\tsal:"+sal+"\tage:"+age+"\tbookname:"+book.name+"\tbookprice:"+book.price);
}
}
class Book {
String name;
int price;
public Book(String name, int price) {
this.name = name;
this.price = price;
}
}
第二种
删除了比较时全部相等时返回1导致Treeset无法区分比较后完全相同的情况.Person类设了一个flag用于标记变量名;注释增加换行
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class CrossGift {
public static void main(String[] args) {
Person p1=new Person("p1","lisi", 122, 25, "javase1", 12); //创建对象
Person p2=new Person("p2","zhangsna", 122, 23, "javase1", 12);
Person p3=new Person("p3","lisi", 122, 23, "javase2", 12);
Person p4=new Person("p4","lisi", 122, 23, "javase1", 12);
Person p5=new Person("p5","lisi", 122, 23, "javase2", 15);
Person p6=new Person("p6","lisi", 123, 22, "javase3", 13);
//创建TreeSet同时匿名内部类传入比较器
TreeSet<Person> ts = new TreeSet<>(new Comparator<Person>() {
//比较,可调整 p1比p2还是p2比p1改变排序方式.
@Override
public int compare(Person p1, Person p2) {
return (p2.sal - p1.sal != 0 ? p2.sal - p1.sal
: p1.age - p2.age != 0 ? p1.age - p2.age
: p1.name.compareTo(p2.name) != 0 ? p1.name.compareTo(p2.name)
: p1.book.price - p2.book.price != 0 ? p1.book.price - p2.book.price
: p1.book.name.compareTo(p2.book.name) );
}
}); //开存
ts.add(p1);
ts.add(p2);
ts.add(p3);
ts.add(p4);
ts.add(p5);
ts.add(p6);
Iterator<Person> it=ts.iterator();//用迭代器取出,看排序
while (it.hasNext())
System.out.println(it.next().toString());
}
}
class Person {
String flag;//做了个标记用于标记变量名字,以观察排序效果;
String name;
int sal;
int age;
Book book;
public Person(String flag,String name,int sal,int age,String bookname,int bookprice) {
this.flag=flag;
this.name=name;
this.sal=sal;
this.age=age;
this.book=new Book(bookname,bookprice);
}
public String toString(){//覆盖Object的toString()方法用于查看输出/
return(this.flag+":\tname:"+name+"\tsal:"+sal+"\tage:"+age+"\tbookname:"+
book.name+"\tbookprice:"+book.price);
}
}
class Book {
String name;
int price;
public Book(String name, int price) {
this.name = name;
this.price = price;
}
}
其他题目:
编写一个商品类(商品id 商品价格double 上架时间Date 商品名称String)
放在TreeSet中,使用匿名内部内实现比较器的排序,排序的优先级(id,价格,时间,名称)