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. java多线程基本概述(三)——同步方法

    非线程安全其实是在多个线程对同一个对象实例的变量进行并发访问的时候发生,产生的后果就是脏读,也就是取到的数据是修改过的.而线程安全就是获得的实例变量的值是经过同步处理的,从而不会出现脏读现象. 1.1 ...

  2. Elasticsearch搜索之cross_fields分析

    cross_fields类型采用了一种以词条为中心(Term-centric)的方法,这种方法和best_fields及most_fields采用的以字段为中心(Field-centric)的方法有很 ...

  3. R语言与SQL server链接

    第一步:创建数据源(方法见下面链接) http://www.2cto.com/database/201412/365396.html 第二步:在R中输入以下代码: #####SQL SERVER与R语 ...

  4. 【转载】GPIO模拟i2c通信

    I2C总线的通信过程(见图4-8)主要包含三个主要阶段:起始阶段.数据传输阶段和终止阶段. 1. 起始阶段 在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平.如果此时主 ...

  5. 是什么让spring 5放弃了使用Guava Cache?

    一路走来,Spring社区从刚开始的核心模块一直发展到现在,最近Sping5也完成了M5的发布, 相信不久之后第一个RELEASE版本也会发布.里面有很多特性是和即将要发布的JAVA 9息息相关的.今 ...

  6. crash部分命令用法

    Set set [pid | taskp | [-c cpu] | -p] | [crash_variable [setting]] | -v 1.设置要显示的内容,内容一般以进程为单位. Set p ...

  7. 04(2) 基于上下文相关的GMM-HMM声学模型2之参数共享

    1.三音素建模存在的问题 问题一:很多三音素在训练数据中没有出现(尤其跨词三音素) 问题二:在训练数据中出现过的三音素有相当一部分出现的频次较少 因此,三音素模型训练时存在较严重的数据不足问题 2.参 ...

  8. 浅谈移动端rem的用法

    一 什么是rem? “font size of the root element 这是w3c的定义 也就是说是相对于根节点(html节点)的字体大小的单位. 目前主流的浏览器基本都支持rem这个单位, ...

  9. 使用fontawesome图标

     我每次找图标时都是在阿里的开源图标库中找的,但是使用起来不是很方便.而我发现了fontawesome之后,觉得实在不错,所以分享给大家.  这是一些参考的文档. fontawesome下载与使用介绍 ...

  10. 单页应用跳转ui-view,$stateProvider,$urlRouterProvider

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta charset="UTF- ...