- -
这几天一直在弄自己的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中实现排序,呵呵,把它记录下来真爽!
分享到:
相关推荐
通过简单的例子初步了解Comparable和Comparator的使用,注释很详细
java Comparator 用法 例子java Comparator 用法 例子java Comparator 用法 例子java Comparator 用法 例子
程序实现时间排序Comparator
java的Comparator和Comparable
Java中Comparator接口的用法 对集合排序的例子 Comparator
java排序Comparator和Comparable
Java-中的-Comparator-和-Comparable.md
资源分类:Python库 所属语言:Python 资源全名:comparator-0.2.1-py2.7.egg 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Comparable&Comparator区别,看完就明白了
文件比對工具,可以生成比對報告,支持itd、doc和ttx。
comparator接口与Comparable接口的区别
简单的用commons的jar包,运用其中Comparator的方法,希望对你有所帮助。
This software shows the necessary configuration to use Comparator0 as a reset source.
本文,先介绍Comparable 和Comparator两个接口,以及它们的差异;接着,通过示例,对它们的使用方法进行说明
教你学会Comparator和Comparable
comparator, 提供比较PHP值相等性的功能 比较器这个组件提供了比较PHP值相等性的功能。安装你可以使用 Composer 将这里库作为本地项目添加到项目中:composer require sebastian/comparator如果在开发期间只
主要介绍了java比较器comparator使用示例,需要的朋友可以参考下
NULL 博文链接:https://hellogava.iteye.com/blog/1570101
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
HT45F23_Comparator_功能使用范例