GUAVA提供了一个比较强大的排序器Ordering
一、简介:
官网简介如下
Ordering
is Guava's "fluent" Comparator
class, which can be used to build complex comparators and apply them to collections of objects.
At its core, an Ordering
instance is nothing more than a special Comparator
instance. Ordering
simply takes the methods that rely on a Comparator
(for example, Collections.max
) and makes them available as instance methods. For additional power, Ordering
class provides chaining methods to tweak and enhance existing comparators
借助翻译软件了解到,其大致概念是:它可以用来构建复杂的比较器,并将它们应用于对象集合。其核心,一个Ordering实例只不过是一个特殊的比较器实例。ordered简单地采用依赖于比较器(例如Collections.max)的方法,并将它们作为实例方法提供。为了获得更多的功能,orderclass提供了chaining的方式来调整和增强现有的比较器
二、Ordering的Creation实验
实验列表如下:
step1 测试Ordering.natural()创建ordering
Ordering通过natural()方法创建时,功能为对创建时指定的类型,进行自然排序
简单实验代码:
//数字自然排序
List naturalNumberList = Lists.newArrayList(1, 7, 2, 0, 4, 5, 3, 6);
Ordering naturalNumberOrdering = Ordering.natural();
System.out.println("======数字测试naturalOrdering ========" + JsonMoreUtils.toJson(naturalNumberOrdering.sortedCopy(naturalNumberList)));
//日期自然排序
LocalDateTime localDateTime1 = LocalDateTime.of(2018, 9, 25, 16, 46);
LocalDateTime localDateTime2 = LocalDateTime.of(2018, 9, 26, 16, 46);
LocalDateTime localDateTime3 = LocalDateTime.of(2018, 8, 1, 16, 46);
List naturalDateList = Lists.newArrayList(localDateTime1,localDateTime2,localDateTime3);
Ordering naturalDateOrdering = Ordering.natural();
System.out.println("======日期测试naturalOrdering========" + JsonMoreUtils.toJson(naturalDateOrdering.sortedCopy(naturalDateList)));
实验结果:
======数字测试naturalOrdering ========[0,1,2,3,4,5,6,7]
======日期测试naturalOrdering========[{"year":2018,"monthValue":8,"month":"AUGUST","dayOfMonth":1,"dayOfYear":213,"dayOfWeek":"WEDNESDAY","hour":16,"minute":46,"second":0,"nano":0,"chronology":{"id":"ISO","calendarType":"iso8601"}},{"year":2018,"monthValue":9,"month":"SEPTEMBER","dayOfMonth":25,"dayOfYear":268,"dayOfWeek":"TUESDAY","hour":16,"minute":46,"second":0,"nano":0,"chronology":{"id":"ISO","calendarType":"iso8601"}},{"year":2018,"monthValue":9,"month":"SEPTEMBER","dayOfMonth":26,"dayOfYear":269,"dayOfWeek":"WEDNESDAY","hour":16,"minute":46,"second":0,"nano":0,"chronology":{"id":"ISO","calendarType":"iso8601"}}]
结论:可以看出其确实是按照指定类型自然排序
step2 测试Ordering.from()创建ordering
Ordering通过from()方法创建时,会传入一个指定的Comparator
功能为按照创建时指定的Comparator
简单实验代码:
List fromNumberList = Lists.newArrayList(1, 7, 2, 0, 4, 5, 3, 6);
//from方法测试
Ordering fromOrdering = Ordering.from((Comparator) Comparator.naturalOrder());
System.out.println("======数字测试fromOrdering ========" + JsonMoreUtils.toJson(fromOrdering.sortedCopy(fromNumberList)));
实验结果:
======数字测试fromOrdering ========[0,1,2,3,4,5,6,7]
step3 测试Ordering.explicit()创建ordering
Ordering通过explicit()方法创建时,会传入一个指定的List
功能为按照创建时指定的List
简单实验代码:
List explicitNumberList = Lists.newArrayList(1, 7, 2, 0, 4, 5, 3, 6);
//explicit方法测试
System.out.println("====================测试Ordering.explicit========================");
List explicitList1 = Lists.newArrayList(1, 7, 2, 0, 4, 5, 3, 6);
System.out.println("=====正向测试======explicitOrdering1===============" + JsonMoreUtils.toJson(Ordering.explicit(explicitList1).sortedCopy(explicitNumberList)));
List explicitList2 = Lists.newArrayList(1, 3, 2, 4, 5, 7, 6, 0);
System.out.println("=======正向测试====测试explicitOrdering2===============" + JsonMoreUtils.toJson(Ordering.explicit(explicitList2).sortedCopy(explicitNumberList)));
//值得注意的是sortedCopy中的元素都得有比较的值,否则会出现某节点无法compare异常 & 精确序列中不允许存在相同的元素,否则会抛出same key异常
List explicitList3 = Lists.newArrayList(1, 3, 2, 4, 5, 7, 6, 1);
System.out.println("=======反向测试====测试explicitOrdering3相同key===============" + JsonMoreUtils.toJson(Ordering.explicit(explicitList3).sortedCopy(explicitNumberList)));
List explicitList4 = Lists.newArrayList(1, 3, 2, 4, 5, 7, 6, 8);
System.out.println("=======反向测试====测试explicitOrdering4相同key===============" + JsonMoreUtils.toJson(Ordering.explicit(explicitList4).sortedCopy(explicitNumberList)));
实验结果:
=====正向测试======explicitOrdering1===============[1,7,2,0,4,5,3,6]
=======正向测试====测试explicitOrdering2===============[1,3,2,4,5,7,6,0]
拥有重复元素结果:
未完全包含精确元素结果:
step4 测试Ordering.usingToString()创建ordering
Ordering通过usingToString()方法创建时。功能为对创建时指定的类型,进行对象toString()之后自然排序
简单实验代码:
List usingToStringList = Lists.newArrayList(1, 7, 2, 0, 4, 5, 3, 6);
Ordering
实验结果:
=========正向数字测试========usingToStringOrdering=======[0,1,2,3,4,5,6,7]
=========正向字符测试========usingToStringOrdering=======["aaa","bbbb","ccccc"]
step5 测试Ordering.arbitrary()创建ordering
Ordering通过arbitrary()方法创建时。功能为打乱原有的排序
简单实验代码:
List arbitraryList = Lists.newArrayList(1, 7, 2, 0, 4, 5, 3, 6);
//打乱原有的排序
Ordering
实验结果:
=========正向测试========arbitraryOrdering1=======[7,4,0,3,5,2,1,6]
=========正向测试========arbitraryOrdering2=======[7,4,0,3,5,2,1,6]
=========正向测试========arbitraryOrdering3=======[7,4,0,3,5,2,1,6]
=========正向测试========arbitraryOrdering4=======[7,4,0,3,5,2,1,6]
可以看出顺序的确是打乱了,但是每次调用返回的结果是一致的.
未完待续................