下面是一个说明定制的比较函数能力的例子。该例子实现compare( )方法以便它按正常顺序的逆向进行操作。因此,它使得一个树集合按逆向的顺序进行存储。

// 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(); }
}

正如下面的输出所示,树按照逆向顺序进行存储:

F E D C B A

仔细观察实现Comparator并覆盖compare( )方法的MyComp类(正如前面所解释的那样,覆盖equals( )方法既不是必须的,也不是常用的)。

在compare( )方法内部,String方法compareTo( )比较两个字符串。然而由bStr——不是aStr——调用compareTo( )方法,这导致比较的结果被逆向。

对应一个更实际的例子,下面的例子是用TreeMap程序实现前面介绍的存储账目资产平衡表例子的程序。在前面介绍的程序中,账目是按名进行排序的,但程序是以按照名字进行排序开始的。下面的程序按姓对账目进行排序。为了实现这种功能,程序使用了比较函数来比较每一个账目下姓的排序。得到的映射是按姓进行排序的。

// Use a comparator to sort accounts by last name.
import java.util.*;
// Compare last whole words in two strings.
class TComp implements Comparator { public int compare(Object a, Object b) { int i, j, k; String aStr, bStr; aStr = (String) a; bStr = (String) b; // find index of beginning of last name i = aStr.lastIndexOf(' '); j = bStr.lastIndexOf(' '); k = aStr.substring(i).compareTo(bStr.substring(j)); if(k==0) // last names match, check entire name return aStr.compareTo(bStr); else return k; } // no need to override equals
}
class TreeMapDemo2 { public static void main(String args[]) { // Create a tree map TreeMap tm = new TreeMap(new TComp()); // Put elements to the map tm.put("John Doe", new Double(3434.34)); tm.put("Tom Smith", new Double(123.22)); tm.put("Jane Baker", new Double(1378.00)); tm.put("Todd Hall", new Double(99.22)); tm.put("Ralph Smith", new Double(-19.08)); // Get a set of the entries Set set = tm.entrySet(); // Get an iterator Iterator itr = set.iterator(); // Display elements while(itr.hasNext()) { Map.Entry me = (Map.Entry)itr.next(); System.out.print(me.getKey() + ": "); System.out.println(me.getValue()); } System.out.println(); // Deposit 1000 into John Doe's account double balance = ((Double)tm.get("John Doe")).doubleValue(); tm.put("John Doe", new Double(balance + 1000)); System.out.println("John Doe's new balance: " + tm.get("John Doe")); }
}

这里是程序的输出结果,注意此时的账目是按姓进行排序的:

Jane Baker: 1378.0
John Doe: 3434.34
Todd Hall: 99.22
Ralph Smith: -19.08
Tom Smith: 123.22
John Doe’s new balance: 4434.34

比较函数类TComp比较两个包含姓和名的字符串。它首先比较姓。具体是这样做的,它首先寻找每一个字符串中最后一个空格的下标,然后比较从这个位置开始的每一个元素的子字符串。当两个字符串中姓完全相等时,它再比较两个名。这样就形成了一个先按姓进行排序,在姓相同的情况下,再按名字进行排序的树型映射。通过程序的输出中Ralph Smith出现在Tom Smith之前的结果可以看到这一点。

开课吧Java课堂:如何使用比较函数?相关推荐

  1. 开课吧Java课堂:是什么是比较函数?

    TreeSet和TreeMap都按排序顺序存储元素.然而,精确定义采用何种"排序顺序"的是比较函数. 通常在默认的情况下,这些类通过使用被Java称之为"自然顺序&quo ...

  2. 开课吧Java课堂:是什么TreeMap类

    TreeMap类通过使用树实现Map接口.TreeMap提供了按排序顺序存储关键字/值对的有效手段,同时允许快速检索.应该注意的是,不像散列映射,树映射保证它的元素按照关键字升序排序. 下面的Tree ...

  3. 开课吧Java课堂之如何使用FilenameFilter

    你总是希望能够限制由list( )方法返回的文件数目,使它仅返回那些与一定的文件名方式或者过滤(filter)相匹配的文件.为达到这样的目的,必须使用list( )的第二种形式: String[ ] ...

  4. 开课吧Java课堂:什么是HashMap类

    HashMap类使用散列表实现Map接口.这允许一些基本操作如get( )和put( )的运行时间保持恒定,即便对大型集合,也是这样的. 下面的构造函数定义为: HashMap( ) HashMap( ...

  5. 开课吧Java课堂:如何将用户定义的类存储于Collection中

    为了简单,类集并没有被限制为只能存储内置的对象.完全相反的是,类集的能力是它能存储任何类型的对象,包括你所创建的类的对象.例如,考虑下面的例子,在这个例子中使用LinkedList存储信箱地址. // ...

  6. 开课吧Java课堂:如何使用迭代函数

    在通过迭代函数访问类集之前,必须得到一个迭代函数.每一个Collection类都提供一个iterator( )函数,该函数返回一个对类集头的迭代函数.通过使用这个迭代函数对象,可以访问类集中的每一个元 ...

  7. 开课吧Java课堂:什么是ArrayList类

    ArrayList类扩展AbstractList并执行List接口.ArrayList支持可随需要而增长的动态数组.在Java中,标准数组是定长的.在数组创建之后,它们不能被加长或缩短,这也就意味着你 ...

  8. 开课吧Java课堂之SortedSet接口如何去用?

    集合接口定义了一个集合.它扩展了Collection并说明了不允许复制元素的类集的特性.因此,如果试图将复制元素加到集合中时,add( )方法将返回false.它本身并没有定义任何附加的方法. Sor ...

  9. 开课吧Java课堂:StringBuffer全解,非常详细

    StringBuffer是提供了大量的字符串功能的字符串(String)类的对等类.正如你所知,字符串(String)表示了定长,不可变的字符序列.相反,StringBuffer表示了可变长的和可写的 ...

最新文章

  1. loadscript加载
  2. ASP.NET一个网站内存放多个config文件(Web.Config文件中configSource 的用法
  3. boost::multiprecision模块测试 cpp_dec_float_50 是否符合我们的 概念要求
  4. mac中NSScrollView自定义滑动条NSScroller
  5. 一个利用System.gc和finalize研究Java垃圾回收机制的练习
  6. jfinal连接mysql数据库_JFinal中怎么获得当前数据库连接的数据库类型?
  7. 使用XFire+Spring构建Web Service(二)
  8. k均值例子 数据挖掘_人工智能、数据挖掘、机器学习和深度学习的关系
  9. Signal 通过区块链慈善组织 The Giving Block 接受加密货币货币捐赠
  10. dirty_ratio与dirty_background_ratio参数区别--系统优化必选
  11. ENVI制作三维立体影像图
  12. macbook m1 vmware fusion 安装centos8
  13. 10:统计输入字符串中的单词个数及单词的平均长度
  14. 滴滴二面:Kafka是如何读写副本消息的?
  15. 《大学“电路分析基础”课程实验合集.实验五》丨线性有源二端网络等效电路的研究
  16. 计算机弹歌光年之外谱子,邓紫棋《光年之外》完整钢琴谱
  17. 聚科技精英,享开源之美- 2019 Open Source Summit 主题演讲+项目亮点
  18. 腾讯Hardcoder Android通讯框架简介
  19. [PKUSC2022]撸猫——Hall定理
  20. 前端开发中聊天场景的体验优化

热门文章

  1. [转载] python中set函数是什么数据类型_Python基本数据类型-list-tuple-dict-set详解
  2. python 基础课程第二天
  3. ROM存储1/4周期正弦信号构造DDS
  4. 无任何网络提供程序接受指定的网络路径
  5. c++中int double 与char,string之间的转换
  6. 《高质量C/C++编程指南》学习笔记
  7. 计算机网络管理员高级操作技能考核试卷,高级计算机维修工操作技能考核试卷...
  8. mysql数据倾斜_sqoop数据倾斜解决实战
  9. java如何给数字每三位加一个逗号_将每三个数字加上逗号处理Java代码
  10. linux 输入8个字母进行排序,Linux排序命令sort详解