专栏首页JavaQGuava之Ordering

Guava之Ordering

Ordering类提供了一些链式的排序方法,相比JDK自带的排序方法更加简练、方便。

Ordering中有3种静态方法用于创建Ordering排序器:

根据上面的方法创建Ordering后,可以继续调用如下方法创建组合功能的排序器:

创建完Ordering排序器后,即可使用它对集合或元素进行操作

下面介绍常用方法的使用。

以下示例代码中使用到的People类包含name和age两个属性。

1.natural方法

该方法使用自然排序规则生成排序器,如从小到大、日期先后顺序。使用这个方法之前先介绍一下onResultOf 方法,这个方法接收一个Function函数,该函数的返回值可以用于natural方法排序的依据,即根据这个返回值来进行自然排序,示例代码如下:

@Test

public void testNatural() {

List<People> peopleList = new ArrayList<People>() {{

add(new People("A", 33));

add(new People("B", 11));

add(new People("C", 18));

}};

Ordering<People> ordering = Ordering.natural().onResultOf(new Function<People, Comparable>() {

@Override

public Comparable apply(People people) {

return people.getAge();

}

});

for (People p : ordering.sortedCopy(peopleList)) {

System.out.println(MoreObjects.toStringHelper(p)

.add("name", p.getName())

.add("age", p.getAge())

);

}

}

sortedCopy方法会使用创建的排序器排序并生成一个新的List。对于Ordering.natural().onResultOf方法,阅读顺序是从后往前,即根据onResultOf 方法的返回值按照自然规则创建一个Ordering,然后调用sortedCopy方法排序并生成新List。输出结果如下:

People{name=B, age=11}

People{name=C, age=18}

People{name=A, age=33}

2.reverse方法

这个方法使用反向的排序规则来排序,即若使用natural规则创建Ordering后,再接着调用reverse方法,则按照自然规则的反向,从大到小的规则排序,示例代码如下:

@Test

public void testReverse() {

List<People> peopleList = new ArrayList<People>() {{

add(new People("A", 33));

add(new People("B", 11));

add(new People("C", 18));

}};

Ordering<People> ordering = Ordering.natural().reverse().onResultOf(new Function<People, Comparable>() {

@Override

public Comparable apply(People people) {

return people.getAge();

}

});

for (People p : ordering.sortedCopy(peopleList)) {

System.out.println(MoreObjects.toStringHelper(p)

.add("name", p.getName())

.add("age", p.getAge())

);

}

}

输入结果如下:

People{name=A, age=33}

People{name=C, age=18}

People{name=B, age=11}

3.usingToString方法

该方法创建Ordering,并根据排序依据值的toString方法值来使用natural规则排序,示例代码如下:

@Test

public void testUsingToString() {

List<People> peopleList = new ArrayList<People>() {{

add(new People("A", 33));

add(new People("B", 11));

add(new People("C", 18));

}};

Ordering<People> ordering = Ordering.usingToString().onResultOf(new Function<People, Comparable>() {

@Override

public Comparable apply(People people) {

return people.getName();

}

});

for (People p : ordering.sortedCopy(peopleList)) {

System.out.println(MoreObjects.toStringHelper(p)

.add("name", p.getName())

.add("age", p.getAge())

);

}

}

输入结果如下:

People{name=A, age=33}

People{name=B, age=11}

People{name=C, age=18}

同时使用usingToString和reverse方法示例代码如下:

@Test

public void testUsingToStringAndReverse() {

List<People> peopleList = new ArrayList<People>() {{

add(new People("A", 33));

add(new People("B", 11));

add(new People("C", 18));

}};

Ordering<People> ordering = Ordering.usingToString().reverse().onResultOf(new Function<People, Comparable>() {

@Override

public Comparable apply(People people) {

return people.getName();

}

});

for (People p : ordering.sortedCopy(peopleList)) {

System.out.println(MoreObjects.toStringHelper(p)

.add("name", p.getName())

.add("age", p.getAge())

);

}

}

输出结果如下:

People{name=C, age=18}

People{name=B, age=11}

People{name=A, age=33}

4.from方法

该方法接收一个自定义的Comparator比较器来创建Ordering,根据Comparator中的自定义规则排序,示例代码如下:

@Test

public void testFrom() {

List<People> peopleList = new ArrayList<People>() {{

add(new People("A", 33));

add(new People("B", 11));

add(new People("C", 18));

}};

Ordering<People> ordering = Ordering.from(new Comparator<People>() {

@Override

public int compare(People o1, People o2) {

return o1.getAge() - o2.getAge();

}

});

for (People p : ordering.sortedCopy(peopleList)) {

System.out.println(MoreObjects.toStringHelper(p)

.add("name", p.getName())

.add("age", p.getAge())

);

}

}

输出结果如下:

People{name=B, age=11}

People{name=C, age=18}

People{name=A, age=33}

同时使用from和reverse方法,示例代码如下:

@Test

public void testFromAndReverse() {

List<People> peopleList = new ArrayList<People>() {{

add(new People("A", 33));

add(new People("B", 11));

add(new People("C", 18));

}};

Ordering<People> ordering = Ordering.from(new Comparator<People>() {

@Override

public int compare(People o1, People o2) {

return o1.getAge() - o2.getAge();

}

}).reverse();

for (People p : ordering.sortedCopy(peopleList)) {

System.out.println(MoreObjects.toStringHelper(p)

.add("name", p.getName())

.add("age", p.getAge())

);

}

}

输出结果如下:

People{name=A, age=33}

People{name=C, age=18}

People{name=B, age=11}

本文分享自微信公众号 - JavaQ(Java-Q),作者:wind瑞

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Dubbo异步方法调用里有个坑(更新)

    Dubbo是一个分布式服务框架,是阿里巴巴SOA服务化治理方案的核心框架。 使用Dubbo进行服务化后,现有如下场景时序图: ? 场景描述:客户端远程异步调用S...

    JavaQ
  • 深入理解Spring系列之一:开篇

    Spring经过大神们的构思、编码,日积月累而来,所以,对其代码的理解也不是一朝一夕就能快速完成的。源码学习是枯燥的,需要坚持!坚持!坚持!当然也需要技巧,第一...

    JavaQ
  • 深入理解Spring框架之AOP实现原理

    该动态代理是基于接口的动态代理,所以并没有一个原始方法的调用过程,整个方法都是被拦截的。

    JavaQ
  • SSM之Spring的学习

    2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。

    silentcow
  • 【python学习】文本处理之-translate

    2011-09-15 看cookbook 看到很神奇的string.translate 函数 可以剔除字符串中你不需要的串,并可做 maketrans映射 ...

    财主刀刀
  • Spring Cloud Stream 基础应用实战

    业务开发者不再关注具体消息中间件,只需关注Binder对应用程序提供的抽象概念来使用消息中间件实现业务即可。

    黄泽杰
  • 企业如何守好“内容安全”关 ?腾讯安全天御给你锦囊妙计!

    随着互联网的飞速发展,我们进入了一个信息爆炸的时代。图文、视频、聊天、直播等互动内容已经成为人们日常工作、生活不可或缺的部分。然而,在这些日益增长的内容中却充...

    腾讯云安全
  • 【走进OpenCV】重映射与仿射变换

    其中的 f 就是映射方式,也就说,像素点在另一个图像中的位置是由 f 来计算的。

    小白学视觉
  • Spring Cloud Stream 基础应用实战

    业务开发者不再关注具体消息中间件,只需关注Binder对应用程序提供的抽象概念来使用消息中间件实现业务即可。

    程序员历小冰
  • 队花的烦恼一

    ACM队的队花C小+经常抱怨:“C语言中的格式输出中有十六、十、八进制输出,然而却没有二进制输出,哎,真遗憾!谁能帮我写一个程序实现输入一个十进制数n,输出它的...

    书童小二

扫码关注云+社区

领取腾讯云代金券