`
davice_li
  • 浏览: 92952 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Conllection框架中的Comparator使用笔记

阅读更多

- -

 

这几天一直在弄自己的RSS解析器。一切顺利,RSS的解析很容易。当我将解析的新闻用Lucene进行索引时,我遇到了一个小小的麻烦

这几天一直在弄自己的RSS解析器。一切顺利,RSS的解析很容易。当我将解析的新闻用Lucene进行索引时,我遇到了一个小小的麻烦。
当新闻解析完成后,为了下一步处理的方便,我并没有将解析的新闻全部的索引,而是只索引新出现的新闻,而索引中已有的新闻,则不再索引了。这样,下步检索时,就可以根据索引的时间来判断最新的新闻。代码如下:
reader = IndexReader.open(indexDir); // open existing lucene index
uidIter = reader.terms(new Term("uid", "")); // init uid iterator
Iterator itI = al.iterator();
      while (itI.hasNext()) {
        ItemIF item = (ItemIF) itI.next();
        while (uidIter.term() != null && uidIter.term().field() == "uid" &&
               uidIter.term().text().compareTo(item.getTitle()) < 0) {         
          uidIter.next();         
        }
        if (uidIter.term() != null && uidIter.term().field() == "uid" &&
            uidIter.term().text().compareTo(item.getTitle()) == 0) {
          uidIter.next(); 
        }
        else {
          if (logger.isDebugEnabled()) {
            logger.debug("Add item " + item + " to index.");
          }
          writer.addDocument(RssDocument.makeDocument(item));
        }
      }
可 以看到其中有两个Iterator,一个是Lucene索引中已有新闻的Iterator,一个是新解析的新闻的Iterator。上一段代码就是判断新 解析的新闻是否在索引中存在,如果存在则保留以前的,不存在则加入。这段代码应该说效率很高,只是两个遍历就完成了判断,而不是每一条新闻都去在索引中遍 历一次。但问题来了,要实现上面的代码,必须要保证两个Iterator都是按照新闻标题(Title)的顺序排列。前一个索引的 Iterator,Lucene返回时就已经是排列好了的,用起来倒方便。后一个自己解析的Iterator却是没有排序的。Iterator怎么排序 啊?这个问题以前到没有仔细想过。自己想了很多办法,但考虑效率的话不是很满意,毕竟数据量大时效率还是很重要的。想来想去还是用Java Collenction框架里提供的方法吧。查了一些资料,发现Collection框架下的东东确实做得比较好,其中框架提供的两个实用类 Comparable和Comparator正是我需要的。以前不知道这两个东东是干啥的,原来是用在容器类内部元素排序用的。 ;)
于 是自己写了一个排序的类,并利用java.util.Collections类中的sort()方法对我的新闻集合中的元素进行排序。调用 Collections.sort()时,集合中的元素如果本身没有实现Comparator的话,则需要自己写一个Comparator传到 sort()方法中。我写了一个ItemComparator , 根据新闻的标题来排序。代码如下:
 ...
  public void indexItems(boolean createNewIndex, Collection items) throws java.
      io.IOException {
    ArrayList al = (ArrayList) items;
    Collections.sort(al, new ItemComparator());
...
...
  public static class ItemComparator
      implements Comparator {
    public int compare(Object element1, Object element2) {
      ItemIF item1 = (ItemIF) element1;
      ItemIF item2 = (ItemIF) element2;
      return item1.getTitle().compareTo(item2.getTitle());
    }
  }
ItemIF就是新闻集合中的一个元素。getTitle()方法可以得到新闻的标题。在sort()方法中,将ItemComparator传过去,既可根据新闻标题排序了。
今天又学会了怎么在Collection中实现排序,呵呵,把它记录下来真爽!
分享到:
评论

相关推荐

    Java集合框架学习笔记

    在集合框架中,还有其他关键接口和类,例如`Iterator`用于遍历集合,`Comparator`用于自定义排序规则,以及`EnumSet`和`EnumMap`针对枚举类型的优化集合实现。`Collections`和`Arrays`工具类提供了许多静态方法,...

    高手总结Java初学者学习经验笔记整理

    ### 高手总结Java初学者学习经验笔记整理 #### 一、Java集合框架概述 Java集合框架是Java标准库中的一个重要组成部分,它提供了一组接口和实现类来处理各种数据结构,比如列表、集合和映射等。这些数据结构允许...

    李兴华java1.8视频笔记

    反射机制在Java中的应用广泛,特别是在框架开发和各种底层API中。 类集框架是Java集合框架的简称,提供了表示和操作集合的接口和类。Java集合框架主要包括Collection接口和Map接口,以及它们的多个子接口和实现类。...

    java学习笔记

    总结起来,这份Java学习笔记深入介绍了Java集合框架的使用,涵盖了`Set`、`List`和`Map`接口及其主要实现类,以及如何处理元素的添加、遍历和排序等问题。理解这些概念和操作对于掌握Java编程至关重要,无论你是初学...

    2020-07-28课堂笔记.docx

    在Java编程语言中,集合框架是处理对象组的重要工具,其中Collection是最基础的接口。本堂课主要聚焦于Collection接口及其子接口,特别是Set接口及其常见的实现类。 首先,Collection接口是所有单值容器的父接口,...

    Java笔记-集合与算法

    - **Iterable接口**:允许使用`for-each`循环遍历集合中的元素,所有标准库集合都实现了这一接口。 ##### 1.2 集合实现 - **链表(List)**:提供了高效的插入和删除操作,但不支持随机访问。 - **优点**:插入和...

    java 学习笔记

    在Java学习笔记中,我们重点关注Java的IO(输入/输出)操作、常用类库以及集合框架。 1. **Java IO**: - **File类**:提供了文件和目录的基本操作,如创建、删除、重命名等。 - **RandomAccessFile**:支持对...

    Java学习笔记-个人整理的

    {2.8}框架中移动的小球}{59}{section.2.8} {2.9}抽象与接口}{59}{section.2.9} {2.10}访问控制}{60}{section.2.10} {2.10.1}类的属性}{60}{subsection.2.10.1} {2.10.2}类的方法}{61}{subsection.2.10.2} {...

    Java从入门到高级(第二天)

    - **声明异常**:在方法签名中使用throws关键字声明可能抛出的检查异常。 - **throw与throws的区别**:throw用于执行时抛出异常,而throws用于方法声明异常。 - **捕获异常**:try...catch块用于捕获并处理异常,...

Global site tag (gtag.js) - Google Analytics