0

我正在尝试使用 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:

这是我尝试对数组列表进行排序的方式:

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 类 'java.util.Collections' 上调用方法 'sort(java.util.ArrayList, com.myjavacode.CustomComparator)' 时出错

任何帮助将不胜感激。

4

3 回答 3

2

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

我认为你有不正确的完全限定类名Documentand NotesException。他们应该是lotus.domino.Documentlotus.domino.NotesException分别。

于 2012-10-08T17:24:00.067 回答
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;
    }

}
于 2012-10-08T20:12:57.563 回答
1

并不是说这个答案对您来说一定是最佳实践,但上次我尝试做同样的事情时,我意识到我可以通过 SSJS 将文档作为 NotesViewEntryCollection 获取:

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

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

同样,如果您的收藏不能等同于 Notes View 的一部分,对不起,但对于那些有可用简单方法的人来说,KISS。我经常提醒自己。

于 2012-10-10T15:01:54.033 回答