1

在我的文档中,我有 3 个文本列表字段。我可以对第一个 Text-List 升序进行排序。但是如何使文本列表 2 和 3 遵循文本列表 1 的最终排序?类似于以下内容:

排序前:

文本列表 1 (C, A, D, B), 文本列表 2 (W, X, Y, Z), 文本列表 3 (L, I, S, T)

排序后(我希望它如下所示):

文本列表 1(A、B、C、D)、文本列表 2(X、Z、W、Y)、文本列表 3(I、T、L、S)

有什么办法可以做到这一点?我尝试将每个 Text-List 放入数组中,但是比较 Text-List 1 中的哪个元素应该首先出现,同时跟踪临时变量中的索引并使用索引重新排序 Text-通过将它们的元素转移到它们各自的第二个临时数组中来列出 2 和 3。

4

3 回答 3

4

假设你有

  • 文档 List1、List2 和 List3 中的三个字段
  • 它们具有相同数量的列表元素
  • 他们不会在一起大于 64K

然后您可以在 Evaluate 的帮助下连接列表、排序并将它们写回字段:

vResult = Evaluate(|
    _Delimiter := "#";
    _ListAll := @Sort(List1 + _Delimiter + List2 + _Delimiter + List3);
    FIELD List1 := @Word(_ListAll; _Delimiter; 1);
    FIELD List2 := @Word(_ListAll; _Delimiter; 2);
    FIELD List3 := @Word(_ListAll; _Delimiter; 3);
    ""|, doc)

选择一个不会出现在列表中的分隔符。

于 2013-09-17T05:59:44.923 回答
1

我会创建一个自定义类:

  public class TripleText

   private v1 as string
   private v2 as string
   private v3 as string

   sub new(s1 as string, s2 as string, s3 as string)
     v1 = s1
     v2 = s2
     v3 = s3
   end sub

   property get value1 as string
    value1 = v1
   end property

   property get value2 as string
    value2 = v2
   end property

   property get value3 as string
    value3 = v3
   end property

  end class

然后我会创建一个数组:

  dim sortMe(4) as TripleText

填充它:

  dim text1 as variant
  dim text2 as variant
  dim text3 as variant

  text1 = doc.getItemValue("textList1")
  text2 = doc.getItemValue("textList2")
  text3 = doc.getItemValue("textList3")

  for i = 0 to 4
   sortMe(i) = new TripleText(text1(i),text2(i),text3(i))
  next

现在您所要做的就是对 SortMe 数组进行排序。您可以在此处找到 LotusScript 中的示例 QuickSort 实现,经过一些重写以使其适用于 TripleText,您只需调用它:

dim Sorted(4) as TripleText Sorted = QuickSort(SortMe)

链接的 QuickSort 实现对字符串数组进行排序,并且您有一个 TripleText 数组。这就是为什么我说会有一些重写来适应它,但是修改代码很容易,以便它接受一个 TripleText 数组并根据 value1 属性对其进行排序。即,我不会为您重写所有代码,但关键是不要像这样进行比较:

If sA(i) < PivotValue Then

你会这样做:

If TT(i).value1 < PivotValue Then

交换,或当然,处理包含所有三个值的整个 TripleText 对象,而不仅仅是 value1。

(我将 SA 重命名为 TT,因为我认为 SA 代表“字符串数组”。如果我要窃取此代码,我肯定会费心重命名以使其适合我的目的。)

最后,一旦您调用了 QuickSort 并以正确的顺序获取了 SortMe 数组,您只需将 TripleText 数组中的值提取回字符串数组,然后使用 ReplaceItemValue 将这些字符串数组放回 NotesItems :

  for i = 0 to 4
   text1(i) = sortMe(i).value1
   text2(i) = sortMe(i).value2
   text3(i) = sortMe(i).value3
  next
  doc.ReplaceItemValue("TextList1",text1)
  doc.ReplaceItemValue("TextList2",text2)
  doc.ReplaceItemValue("TextList3",text3)
于 2013-09-17T04:35:49.743 回答
1

当然,有很多用于 LotusScript 的排序算法。但是您的问题可以使用评估语句轻松解决:

Dim doc as NotesDocument
'- somehow set the doc
Dim varResult as Variant

varResult = Evaluate({@Sort(Fieldlist1) : @Sort(Fieldlist2) : @Sort(Fieldlist3)}, doc)

如果您不想使用评估,您可以实现您选择的排序算法并执行以下操作:

Dim varResult as Variant

VarResult = YourSortFunction(doc.Fieldlist1)
VarResult = ArrayAppend( VarResult,YourSortFunction(doc.Fieldlist2) )
VarResult = ArrayAppend( VarResult,YourSortFunction(doc.Fieldlist3) )
于 2013-09-16T21:29:19.270 回答