📄 compdemo.java
字号:
package 比较函数;
/**
TreeSet和TreeMap都按排序顺序存储元素。然而,精确定义采用何种“排序顺序”的
是比较函数。通常在默认的情况下,这些类通过使用被Java称之为“自然顺序”的顺序存
储它们的元素,而这种顺序通常也是你所需要的(A在B的前面,1在2的前面,等等)。如
果需要用不同的方法对元素进行排序,可以在构造集合或映射时,指定一个Comparator对
象。这样做为你提供了一种精确控制如何将元素储存到排序类集和映射中的能力。
Comparator接口定义了两个方法:compare( )和equals( )。这里给出的compare( )方法按
顺序比较了两个元素:
int compare(Object obj1, Object obj2)
obj1和obj2是被比较的两个对象。当两个对象相等时,该方法返回0;当obj1大于obj2
时,返回一个正值;否则,返回一个负值。如果用于比较的对象的类型不兼容的话,该方
法引发一个ClassCastException异常。通过覆盖compare( ),可以改变对象排序的方式。例如,
通过创建一个颠倒比较输出的比较函数,可以实现按逆向排序。
这里给出的equals( )方法,测试一个对象是否与调用比较函数相等:
boolean equals(Object obj)
obj是被用来进行相等测试的对象。如果obj和调用对象都是Comparator的对象并且使用
相同的排序。该方法返回true。否则返回false。重载equals( )方法是没有必要的,大多数简
单的比较函数都不这样做。
正如下面的输出所示,树按照逆向顺序进行存储:
F E D C B A
仔细观察实现Comparator并覆盖compare( )方法的MyComp类(正如前面所解释的那样,
覆盖equals( )方法既不是必须的,也不是常用的)。在compare( )方法内部,String方法
compareTo( )比较两个字符串。然而由bStr——不是aStr——调用compareTo( )方法,这导致
比较的结果被逆向。
*/
// Use a custom comparator.
import java.util.*;
// A reverse comparator for strings.
class MyComp
implements Comparator {
public int compare(Object a, Object b) {
String aStr, bStr;
aStr = (String) a;
bStr = (String) b;
// reverse the comparison
return bStr.compareTo(aStr);
}
// no need to override equals
}
class CompDemo {
public static void main(String args[]) {
// Create a tree set
TreeSet ts = new TreeSet(new MyComp());
// Add elements to the tree set
ts.add("C");
ts.add("A");
ts.add("B");
ts.add("E");
ts.add("F");
ts.add("D");
// Get an iterator
Iterator i = ts.iterator();
// Display elements
while (i.hasNext()) {
Object element = i.next();
System.out.print(element + " ");
}
System.out.println();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -