题目:

封装一个人类,属性姓名,收入,年龄,书,
封装一个书类:属性书名,价格
存储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(){//覆盖 的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(){//覆盖 的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,价格,时间,名称)

收藏 打印