Comparator有两种实现方式:

1,匿名内部类

2,创建一个类用于实现Comparator,该类创建的对象就是比较器

Person类

public class Person implements Comparable<Person> {
private String name;
private String sex;
private int age;
private Book books;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Book getBooks() {
return books;
}
public void setBooks(Book books) {
this.books = books;
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age +
", books.name=" + books.getBookName() + ", books.price=" + books.getPrice() + "]";
}
public Person(String name, String sex, int age, Book books) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.books = books;
}
public Person() {
super();
} }

Book类

package Homework3;

public class Book {
//Book类中 有 书名,书的价格
private String bookName;
private int price;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Book [bookName=" + bookName + ", price=" + price + "]";
}
public Book(String bookName, int price) {
super();
this.bookName = bookName;
this.price = price;
}
public Book() {
super();
} }

Comparator实现–匿名内部类

public class Test {
public static void main(String[] args){
//Comparator
TreeSet<Person> set2=new TreeSet<>(new Comparator<Person>() { @Override
public int compare(Person o1, Person o2) {
if(o1.getAge()>o2.getAge()){
return -1;
}else if (o1.getAge()<o2.getAge()) {
return 1;
}else {
CollationKey key=Collator.getInstance().getCollationKey(o1.getName());
CollationKey key2=Collator.getInstance().getCollationKey(o2.getName());
int n=key.compareTo(key2);
if(n>0){
return 1;
}else if (n<0) {
return -1;
}else {
int a=o1.getBooks().getPrice()-o2.getBooks().getPrice();
if(a>0){
return -1;
}else if (a<0) {
return 1;
}else {
CollationKey key3=Collator.getInstance().getCollationKey(o1.getBooks().getBookName());
CollationKey key4=Collator.getInstance().getCollationKey(o2.getBooks().getBookName());
int m=key3.compareTo(key4);
if(m>0){
return 1;
}else if (m<0) {
return -1;
}else {
return 0;
}
} }
}
}
});
// 第一条件: 年龄 降序
set2.add(new Person("Jane1", "female", 20, new Book("z指环王", 30)));
set2.add(new Person("Jane2", "female", 30, new Book("z指环王", 30)));
// 第二条件: 姓名升序
set2.add(new Person("Ada3", "female", 30, new Book("z指环王", 30)));
// 第三条件: 书的价格 降序
set2.add(new Person("Ada4", "female", 30, new Book("z指环王", 50)));
// 第四条件: 书名 升序
set2.add(new Person("Ada5", "female", 30, new Book("m指环王", 50)));
System.out.println(set2);
}
}

TreeSet集合排序方式二:定制排序Comparator的更多相关文章

  1. Hadoop案例(八)辅助排序和二次排序案例(GroupingComparator)

    辅助排序和二次排序案例(GroupingComparator) 1.需求 有如下订单数据 订单id 商品id 成交金额 0000001 Pdt_01 222.8 0000001 Pdt_05 25.8 ...

  2. TreeSet的两种排序方式,含Comparable、Comparator

    1.排序的引入 由于TreeSet可以实现对元素按照某种规则进行排序,例如下面的例子 public class TreeSetDemo { public static void main(String ...

  3. Linq排序方式与Lambda排序方式比较以及OrderBy、ThenBy的使用

    沿用之前某一篇文章的实体类与EF操作类代码.数据库中增加几条数据 Linq 的排序方式,下面例子是根据RoleId 升序,Name降序 EFContext<Member> efMember ...

  4. MapReduce之GroupingComparator分组(辅助排序、二次排序)

    指对Reduce阶段的数据根据某一个或几个字段进行分组. 案例 需求 有如下订单数据 现在需要找出每一个订单中最贵的商品,如图 需求分析 利用"订单id和成交金额"作为key,可以 ...

  5. python 实现排序算法(二)-合并排序(递归法)

    #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Nov 21 22:28:09 201 ...

  6. TreeSet之定制排序和自然排序

    TreeSet的几大特点: 1.TreeSet中存储的类型必须是一致的,不能一下存int,一下又存string 2.TreeSet在遍历集合元素时,是有顺序的[从小到大](我的理解,如果存的字母,按字 ...

  7. java TreeSet的排序之定制排序

    TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了: 该接口包含int compare(Object o1,Object o2 ...

  8. List的定制排序 包括使用lambda表达式来实现的方法

    1.先实现Comparator的接口 重写compare方法 根据比较大小来返回数值: 比如:(Integer o1  -   Integer o2); return 1 表示o1>o2; re ...

  9. 详细讲解MapReduce二次排序过程

    我在15年处理大数据的时候还都是使用MapReduce, 随着时间的推移, 计算工具的发展, 内存越来越便宜, 计算方式也有了极大的改变. 到现在再做大数据开发的好多同学都是直接使用spark, hi ...

随机推荐

  1. 【转】JDBC学习笔记(9)——DBUtils的使用

    转自:http://www.cnblogs.com/ysw-go/ 使用DBUtils提供的功能需要使用commons-dbutils-1.6.jar这个JAR包,在Apache官网可以下载到 使用D ...

  2. 记录参加QCon的心得

    如有侵权,请告知作者删除.scottzg@126.com 很荣幸参加QCon全球软件开发大会,这里特别感谢我们部门的总经理,也是<互联网广告算法和系统实践>此书的作者王勇睿.因为他我才有这 ...

  3. ubutun 安装php7.1x

    服务器ecs上本来跑了一套nginx+php5.5,由于新项目使用的是laravel5.4,所以不得不把php升级,在此记录下在此安装的过程和遇到的问题,总体来说还算顺利 cd /usr/local/ ...

  4. sqoop关系型数据迁移原理以及map端内存为何不会爆掉窥探

    序:map客户端使用jdbc向数据库发送查询语句,将会拿到所有数据到map的客户端,安装jdbc的原理,数据全部缓存在内存中,但是内存没有出现爆掉情况,这是因为1.3以后,对jdbc进行了优化,改进j ...

  5. Angular vs React 最全面深入对比

    如今,Angular和React这两个JavaScript框架可谓红的发紫,同时针对这两个框架的选择变成了当下最容易被问及或者被架构设计者考虑的问题,本文或许无法告诉你哪个框架更优秀,但尽量从更多的角 ...

  6. get和post提交数据的区别

    get是客户端向服务器索取数据的请求,设定的初衷是,客户端(浏览器)给服务器发送请求,然后服务器再返回给客户端其要求的数据. 那么为什么说get也能提交数据呢? 我们仔细理解第一句话“客户端(浏览器) ...

  7. FTP中MLST概要解读---解决获取ftpFile为null的另外一种方式

    零.引言 之前写FTP工具库,用的是ftp4j,他使用其他非常简单方便,但是在细节上提供的可选项比较少(当然也可能是我了解不够深刻) 最新的项目重写了FTP工具类,选择了apache net中的ftp ...

  8. 原创-angularjs2不同组件间的通信

    AngualrJs2官方方法是以@Input,@Output来实现组件间的相互传值,而且组件之间必须父子关系,下面给大家提供一个简单的方法,实现组件间的传值,不仅仅是父子组件,跨模块的组件也可以实现传 ...

  9. 【JavaScript】让事件支持先发布后订阅

    之前写过一个的事件管理器,就是普通的先订阅后发布模式.但实际场景中我们需要做到后订阅的也能收到发布的消息.比如我们关注微信公众号,还是能看到历史消息的.类似于qq离线消息,我先发给你,你登录了就能收到 ...

  10. Spring Boot Dubbo applications.properties 配置清单

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 与其纠结,不如行动学习.Innovate ,And out execute ! 』 本文 ...