天天看点

用Java :放在TreeSet中,使用匿名内部内实现比较器的比较

题目:

封装一个人类,属性姓名,收入,年龄,书,

封装一个书类:属性书名,价格

存储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,价格,时间,名称)