接下来我们会讲到辅助类,首先看Comparator组。
ReverseComparator
ComparatorChain
NullComparator
FixedOrderComparator
ComparatorUtils
其实Comparator这个概念并不是Commons Collections引入的,在标准的Java Collections API中,已经明确定了一个java.util.Comparator接口,只是有很多人并不了解,Commons Collections也只是扩展了这个接口而已。这个java.util.Comparator定义如下核心方法:
public int compare(Object arg0, Object arg1)
传给它两个对象,它要告诉我们这两个对象哪一个在特定的语义下更“大”,或者两者相等。如果arg0 > arg1,返回大于0的整数;如果arg0 = arg1,返回0;如果arg0 < arg2,返回小于0的整数。
我们看看Commons Collections给我们提供了哪些Comparator的实现类(都在org.apache.commons.collections.comparators包下面):
BooleanComparator – 用于排序一组Boolean对象,指明先true还是先false;
ComparableComparator – 用于排序实现了java.lang.Comparable接口的对象(我们常用的Java类如String、Integer、Date、Double、File、Character等等都实现了Comparable接口);
ComparatorChain – 定义一组Comparator链,链中的Comparator对象会被依次执行;
FixedOrderComparator – 用于定义一个特殊的顺序,对一组对象按照这样的自定义顺序进行排序;
NullComparator – 让null值也可参与比较,可以设定为先null或者后null;
ReverseComparator – 将原有的Comparator效果反转;
TransformingComparator – 将一个Comparator装饰为具有Transformer效果的Comparator。
// 有关Transformer的内容会在以后的笔记中讲到。
以上除了ComparatorChain之外,似乎都是实现一些很基本的比较方法,但是当我们用ComparatorChain将一组Comparator串起来之后,就可以实现非常灵活的比较操作。那么这些Comparator在实际代码中如何使用呢?看例子:
/** Issue.java */
package sean.study.commons.collections;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
public class Issue {
private long id;
private String severity;
private String owner;
public Issue() {
}
public Issue(long id, String severity, String owner) {
this.id = id;
this.severity = severity;
this.owner = owner;
}
public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
.append("id", id)
.append("severity", severity)
.append("owner", owner)
.toString();
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getSeverity() {
return severity;
}
public void setSeverity(String severity) {
this.severity = severity;
}
}
/** ComparatorUsage.java */
package sean.study.commons.collections;
import java.util.Arrays;
import java.util.Comparator;
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.comparators.ComparatorChain;
import org.apache.commons.collections.comparators.FixedOrderComparator;
import org.apache.commons.lang.StringUtils;
public class ComparatorUsage {
public static void main(String[] args) {
demoComparator();
}
public static void demoComparator() {
System.out.println(StringUtils.center(" demoComparator ", 40, "="));
// data setup
Issue[] issues = new Issue[] {
new Issue(15102, "Major", "John"),
new Issue(15103, "Minor", "Agnes"),
new Issue(15104, "Critical", "Bill"),
new Issue(15105, "Major", "John"),
new Issue(15106, "Major", "John"),
new Issue(15107, "Critical", "John"),
new Issue(15108, "Major", "Agnes"),
new Issue(15109, "Minor", "Julie"),
new Issue(15110, "Major", "Mary"),
new Issue(15111, "Enhancement", "Bill"),
new Issue(15112, "Minor", "Julie"),
new Issue(15113, "Major", "Julie")
};
// comparators setup
String[] severityOrder = {"Critical", "Major", "Minor", "Enhancement"};
Comparator severityComparator = new FixedOrderComparator(severityOrder);
ComparatorChain compChain = new ComparatorChain();
compChain.addComparator(new BeanComparator("owner"));
compChain.addComparator(new BeanComparator("severity", severityComparator));
compChain.addComparator(new BeanComparator("id"));
// sort and display
Arrays.sort(issues, compChain);
for (int i = 0; i < issues.length; i++) {
System.out.println(issues[i]);
}
System.out.println(StringUtils.repeat("=", 40));
}
}
输出结果为:
============ demoComparator ============
Issue[id=15108,severity=Major,owner=Agnes]
Issue[id=15103,severity=Minor,owner=Agnes]
Issue[id=15104,severity=Critical,owner=Bill]
Issue[id=15111,severity=Enhancement,owner=Bill]
Issue[id=15107,severity=Critical,owner=John]
Issue[id=15102,severity=Major,owner=John]
Issue[id=15105,severity=Major,owner=John]
Issue[id=15106,severity=Major,owner=John]
Issue[id=15113,severity=Major,owner=Julie]
Issue[id=15109,severity=Minor,owner=Julie]
Issue[id=15112,severity=Minor,owner=Julie]
Issue[id=15110,severity=Major,owner=Mary]
========================================
我们可以看到,ComparatorChain中的Comparator被依次执行,先按name,再按我们自定义的severity次序,再按id,最终我们得到了重新排列的数组。
分享到:
相关推荐
《Apache Commons Collections 3.2.2:Java开发的强大工具》 Apache Commons Collections,简称Collections,是Apache软件基金会提供的一款开源Java库,它为Java集合框架提供了大量的实用工具类和扩展功能。在Java...
`commons-collections-3.2.2-bin.tar`是一个压缩包,它包含了Apache Commons Collections库的3.2.2版本。这个库是Java编程语言中一个非常重要的工具集,专门用于处理集合框架,如列表、映射、集合等。Apache Commons...
Apache Commons Collections 包含多个模块,如 Bag、BidiMap、Buffer、Comparator、Functor、Iterator、Map、Multimap、Set、TransformedMap、TypeConverter 等。这些模块提供了丰富的接口和实现,使得开发者能够...
Commons-Collections seek to build upon the JDK classes by providing new interfaces, implementations and utilities. There are many features, including: Bag interface for collections that have a number...
"commons-collections"是Apache软件基金会的一个开源项目,它提供了一系列强大的、实用的集合框架扩展,使得在Java编程中处理集合对象变得更加方便和灵活。这个jar包包含了多种实用的工具类和接口,扩展了Java标准...
Apache Commons Collections是一个非常重要的Java库,它为Java标准库中的`java.util`包提供了大量扩展,增加了许多实用的集合类、迭代器、映射和转换功能。这个库被广泛用于提高开发效率,尤其是在处理和操作数据...
Commons Collections是一个开源的Java集合框架扩展库,它对Java标准的Collections API提供了大量的补充和改进。它的出现主要是为了解决Java标准集合框架在使用过程中遇到的一些问题,比如操作过于复杂、不够灵活或者...
- **活跃度与更新**:Guava Collections 处于积极维护的状态,持续更新并引入新功能,而 Commons Collections 最近一次更新已较为久远。 #### 四、总结 Google Guava Collections 不仅提供了丰富的工具和功能,还...
Comparator组 提供了比较器的工具方法,如组合多个比较器、反向比较等。 ##### 3.5. 算子组 - **Predicate**:用于判断一个对象是否满足某个条件。 - **Transformer**:用于将一个对象转换为另一个对象。 - **...
Commons Collections库为Java标准集合框架提供了扩展。它包含以下组件: - Bag:存储对象的集合,但对象可以出现多次。 - Buffer:提供队列、栈和缓冲区的实现。 - BiDiMap:双向映射,允许从键映射到值,反之亦然...
在给定的"比较器Comparator简单用法"主题中,我们将深入探讨如何使用`Comparator`以及Apache Commons Lang库中的相关方法。 首先,`Comparator`接口位于`java.util`包下,它包含一个方法`compare(T o1, T o2)`,...
- `commons-collections-2.1.1.jar`: Apache Commons Collections库。 - `velocity-1.4.jar`: Apache Velocity模板引擎。 - `commons-beanutils-core-1.6.jar`: Apache Commons BeanUtils库,主要用于处理Bean...
- ArrayUtils:提供了数组操作的工具方法,如数组复制、填充等。 - StringUtils:提供了大量的字符串操作方法,如字符串的判空、替换、分割等。 - BooleanUtils:提供了布尔值相关操作的工具方法。 - CharUtils...
在这个场景中,我们关注的是`org.apache.commons.beanutils.BeanComparator`,这是一个由Apache Commons BeanUtils项目提供的特殊`Comparator`实现,它专门用来对对象的属性进行比较和排序。 `BeanComparator`类...
1. 类型安全:Guava Collections 基于 JDK5,充分利用了范型,确保类型安全,而 Apache Commons Collections 是基于 JDK1.2。 2. 接口契约:Guava 更严格地遵循 Java Collections Framework 的接口约定,减少了违反...
1. **集合框架**:Apache Commons Collections 提供了对Java集合接口的增强,包括更强大的列表、映射和堆栈实现。例如,`BidiMap`支持双向映射,`MultiMap`允许一个键对应多个值,以及`Comparator`和`Transformer`...
- 当元素类型不支持自然顺序或者需要按照特定规则排序时,可以提供一个Comparator实例给`Arrays.sort()`或`Collections.sort()`,通过重写`compare()`方法来定制排序逻辑。 5. **排序算法**: - Java中虽然内置了...
然后,可以使用`Collections.sort(list, comparator)`对List进行排序,其中`comparator`是`JiaMenuComparator`的实例。 3. **对List元素中的多个属性进行排序(使用commons-beanutils)** 当需要根据List元素的多...
- Apache Commons IO和Apache Commons Lang提供了实用的文件操作和比较工具,可以辅助大文件排序。 - Google的Guava库提供了`Multimap`,对于多字段排序可能有帮助。 总的来说,Java处理大文件多字段排序需要结合...