使用CustomComparator对NotesDocuments的ArrayList进行排序

时间:2012-10-08 15:13:36

标签: arraylist xpages

我正在尝试使用java.util.ArrayList对文档集进行排序。

var myarraylist:java.util.ArrayList = new java.util.ArrayList()
var doc:NotesDocument = docs.getFirstDocument();

while (doc != null) {       
    myarraylist.add(doc)                       
    doc = docs.getNextDocument(doc);        
}

我尝试使用ArrayList而不使用TreeMaps或HashMaps的原因是因为我需要排序的字段不是唯一的;这是对这两个对象的限制(我无法创建自己的密钥)。

我遇到的问题是调用CustomComparator:

我在这里试图对我的arraylist进行排序:

java.util.Collections.sort(myarraylist, new CustomComparator());

我的班级:

import java.util.Comparator;
import lotus.notes.NotesException;

public class CustomComparator implements Comparator<lotus.notes.Document>{


public int compare(lotus.notes.Document doc1, lotus.notes.Document doc2) {
    try {
        System.out.println("Here");
        System.out.println(doc1.getItemValueString("Form"));             
         return doc1.getItemValueString("Ranking").compareTo(doc2.getItemValueString("Ranking"));
    } catch (NotesException e) {
        e.printStackTrace();
    }
    return 0;
}

}

错误:

  

脚本解释器错误,line = 44,col = 23:调用方法时出错   java上的'sort(java.util.ArrayList,com.myjavacode.CustomComparator)'   class'java.util.Collections'

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

我试图在try-catch块中运行你的SSJS代码,在catch块中的异常中打印错误,我收到以下消息 - java.lang.ClassCastException: lotus.domino.local.Document incompatible with lotus.notes.Document

我认为您的DocumentNotesException的完全限定类名称不正确。它们应分别为 lotus.domino.Document lotus.domino.NotesException

答案 1 :(得分:1)

这里是RepeatControl的SSJS:

var docs:NotesDocumentCollection = database.search(query, null, 0);
var myarraylist:java.util.ArrayList = new java.util.ArrayList()
var doc:NotesDocument = docs.getFirstDocument();

while (doc != null) {       
    myarraylist.add(doc)                       
    doc = docs.getNextDocument(doc);        
}

java.util.Collections.sort(myarraylist, new com.mycode.CustomComparator());
return myarraylist;

我的班级:

package com.mycode;
import java.util.Comparator;

public class CustomComparator implements Comparator<lotus.domino.Document>{


    public int compare(lotus.domino.Document doc1, lotus.domino.Document doc2) {
        try {  
             // Numeric comparison  
             Double num1 = doc1.getItemValueDouble("Ranking");
             Double num2 = doc2.getItemValueDouble("Ranking");         
             return num1.compareTo(num2);
             // String comparison
             // return doc1.getItemValueString("Description").compareTo(doc2.getItemValueString("Description"));
        } catch (lotus.domino.NotesException e) {
            e.printStackTrace();
        }
        return 0;
    }

}

答案 2 :(得分:1)

并不是说这个答案对你来说一定是最好的做法,但是上次我尝试做同样的事情时,我意识到我可以通过SSJS把文件作为NotesViewEntryCollection来抓取:

var col:NotesViewEntryCollection = database.getView("myView").getAllEntriesByKey(mtgUnidVal)

而不是NotesDocumentCollection。我刚刚浏览了每个条目,为那些符合我标准的人抓住了UNID,添加到java.util.ArrayList(),然后发送到目的地。我已经在其他地方对文档进行排序,使用父UNID的分类列,所以这可能是我应该先做的事情。仍处于XPage / Notes学习曲线的前沿,因此每天都会带来新的东西。

同样,如果您的集合不等同于Notes视图的一部分,抱歉,但对于那些使用简单方法的人,KISS。我经常提醒自己。