探索J2ME:对记录进行排序

ZDNet软件频道 时间:2002-10-15 作者:BUILDER.COM |  我要评论()
本文关键词:
本文将介绍RMS的记录排序API——特别是RecordEnumeration类和 RecordComparator接口。同时还要顺便谈谈RecordFilter接口,它可以让你在记录库中查找某个特殊的记录。
欢迎回到《探索J2ME》——介绍用J2ME和MIDP开发应用程序的系列文章。通过对前几篇文章的学习,你应该已经了解到了J2ME的记录管理系统(RMS)为动应用程序提供了持久存储的功能。你还应该了解MIDP如何用平面文件的形式来实现存储。如果你对此并不很清楚,我建议你看看《探索J2ME》的前几篇文章,文章标题在下面列出。


如果你刚刚加入我们的行列,你可能希望查看我们早先的几篇文章:
探索J2ME:构建开销追踪系统
探索J2ME:创建开销细节表单
探索J2ME世界:使用记录管理系统



上次,我们通过RecordStore类完成了ExpensesApp应用程序的开销项目的存储功能。RecordStore类提供了对J2ME记录库的基本的访问功能。然而,lsMain显示的开销项目按照输入顺序排列产生了一个小问题,即查询某一个项目比较麻烦。

在本文中,我将介绍RMS的记录排序API——特别是RecordEnumeration类和 RecordComparator接口,你可以在javax.microedition.rms软件包中找到这两者。我同时还要顺便谈谈RecordFilter接口,它可以让你在记录库中查找某个特殊的记录。你可以在这儿下载最新版本ExpensesApp的代码。

用RecordComparator排序

代码清单 A中,你会发现ExpenseInfo.LoadExpenses又一次被修改了,这次利用RecordEnumeration对象来按照记录所保存的某项数据,而不是记录插入的顺序,来从记录库中查找记录:
RecordEnumeration enu = rs.enumarateRecords(null, new ExpenseComparator, false);

RecordStore.enumerateRecords接受一个ExpenseComparator类的对象(为参数),ExpenseComparator类实现了RecordComparator的接口,RecordEnumeration用它来确定用来排序的记录的顺序。我在清单B中给出了ExpenseComparator的代码。

让我们来检测一下RecordComparator.compare方法。Compare方法用于处理两个记录,这两个记录均处于字节数组的形式(参数为bytesbytes1数组),并且必须可以从中提取出任何可以决定先后次序的数据(决定先后次序的方式由RecordEnumeration确定)。该方法然后这样指出这两个记录的相对关系::

  • 如果由bytes代表的记录(插入时间)在前,那么compare会返回ExpenseComparator.PRECEDES,并且bytesbytes1之前出现在枚举(enumeration)中。
  • 如果bytes所代表的记录(的插入时间)在 bytes1所代表的记录之后,那么compare返回ExpenseComparator.FOLLOWS,这样,byteIsbytes之前出现在枚举中。
  • 如果这两个记录是等价的(equivalent)(即同一天输入的),compare返回ExpenseComparator.EQUIVALENT,这两个记录的顺序任意。

ExpenseComparator中,我从这两个记录中获取ExpenseDate字段(它以“当前时刻的毫秒数”的格式被存到记录库中)并根据这两个记录的排序返回相应的值。

实现RecordComparator时,要记住对记录库中的每一个记录至少要调用一次compare方法,(当枚举开始产生时)。所以,你需要正确引导比较过程,使得这所费时间尽量的短,以免没有必要地降低应用程序的运行速度。还有一点就是,你用于比较的两个记录在最后无需紧联(immediately adjacent),分类枚举。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134