Conllection框架中的Comparator使用笔记- -
这几天一直在弄自己的RSS解析器。一切顺利,RSS的解析很容易。当我将解析的新闻用Lucene进行索引时,我遇到了一个小小的麻烦。
当新闻解析完成后,为了下一步处理的方便,我并没有将解析的新闻全部的索引,而是只索引新出现的新闻,而索引中已有的新闻,则不再索引了。这样,下步检索时,就可以根据索引的时间来判断最新的新闻。代码如下:
reader = IndexReader.open(indexDir); // open existing lucene index
uidIter = reader.terms(new Term("uid", "")); // init uid iterator
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));
}
}
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));
}
}
于是自己写了一个排序的类,并利用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());
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());
}
}
implements Comparator {
public int compare(Object element1, Object element2) {
ItemIF item1 = (ItemIF) element1;
ItemIF item2 = (ItemIF) element2;
return item1.getTitle().compareTo(item2.getTitle());
}
}
今天又学会了怎么在Collection中实现排序,呵呵,把它记录下来真爽!