首页 > 代码库 > 86. LotusScript中的数组函数

86. LotusScript中的数组函数

R6对LotusScript有一些改进和增强,自那之后,Notes对象的接口时有补充和更新,但语言本身没有变化。那些改进就包括增加诸如 ArrayGetIndex、ArrayUnique的有用函数。但在编程实践中,还有一些对数组的操作LotusScript没有提供原生的函数,好在 基本上都能自己编写。下面的函数中用到的常数都在lsconst.lss或lserr.lss里定义,在脚本前要附加

%INCLUDE"lsconst.lss"

%INCLUDE"lserr.lss"

判断数组是否包含某个元素。

[vb] view plaincopy在CODE上查看代码片派生到我的代码片
  1. %REM  
  2.     Checks if an array contains a value.  
  3.     The ArrayGetIndex function returns null if the value is not found.  
  4. %END REM  
  5. Public Function ArrayContains(source As Variant, value As Variant) As Boolean  
  6.     ‘the data type of source is not checked intentionally  
  7.     ArrayContains=Not IsNull(ArrayGetIndex(source,value))  
  8. End Function  

LotusScript中的数组最多可以有八维(dimension),下面这个函数利用运行时错误(run-time error)ErrSubscriptOutOfRange获得维数。

[vb] view plaincopy在CODE上查看代码片派生到我的代码片
  1. ‘Returns the number of an array‘s dimensions  
  2. Function ArrayDimension(array As Variant) As Integer  
  3.     If Not IsArray(array) Then  
  4.         ArrayDimension=0  
  5.         Exit Function   
  6.     End If  
  7.       
  8.     On Error ErrSubscriptOutOfRange GoTo RESULT  
  9.     Dim d As Integer, lb As Integer    
  10.     For d=1 To 9  
  11.         lb=LBound(array, d)   
  12.     Next  
  13.       
  14. RESULT:  
  15.     ArrayDimension=d-1  
  16.     Exit Function   
  17. End Function  

返回多维数组的大小,即所有元素的个数。

[vb] view plaincopy在CODE上查看代码片派生到我的代码片
  1. Function ArraySize(array As Variant) As Integer  
  2.     If Not IsArray(array) Then  
  3.         ArraySize=0  
  4.         Exit Function   
  5.     End If  
  6.       
  7.     ArraySize=1  
  8.     Dim d As Integer  
  9.     d=ArrayDimension(array)  
  10.     Dim i As Integer  
  11.     For i=1 To d  
  12.         ArraySize=ArraySize*(UBound(array, i)-LBound(array,i)+1)  
  13.     Next      
  14. End Function  

判断两个数组的“形状”,也就是维数和每一维的上下限是否相同。这个函数在今后比较数组是否相等时有用。

[vb] view plaincopy在CODE上查看代码片派生到我的代码片
  1. Function ArrayBoundsEquals(a1 As Variant, a2 As Variant) As Boolean  
  2.     If (Not IsArray(a1)) Or (Not IsArray(a2)) Then  
  3.         ArrayBoundsEquals=False  
  4.         Exit Function   
  5.     End If  
  6.       
  7.     Dim d1 As Integer, d2 As Integer  
  8.     d1=ArrayDimension(a1)  
  9.     d2=ArrayDimension(a2)  
  10.     If d1<>d2 Then  
  11.         ArrayBoundsEquals=False  
  12.         Exit Function         
  13.     End If  
  14.       
  15.     Dim d As Integer  
  16.     For d=1 To d1  
  17.         If LBound(a1)><LBound(a2) Or UBound(a1)><UBound(a2) Then  
  18.             ArrayBoundsEquals=False  
  19.             Exit Function             
  20.         End If  
  21.     Next  
  22.       
  23.     ArrayBoundsEquals=True   
  24. End Function  

将多维数组转换成一维数组。这个函数同样用于比较两个数组是否相等。

[vb] view plaincopy在CODE上查看代码片派生到我的代码片
  1. Function ArrayToOneDimension(array As Variant) As Variant  
  2.     If Not IsArray(array) Then  
  3.         Call SetValue(ArrayToOneDimension, array)  
  4.         Exit Function   
  5.     End If  
  6.       
  7.     Dim d As Integer  
  8.     d=ArrayDimension(array)  
  9.     If d=1 Then  
  10.         ArrayToOneDimension=array  
  11.         Exit Function  
  12.     End If  
  13.       
  14.     Dim size As Integer  
  15.     size=ArraySize(array)  
  16.     Dim result() As Variant  
  17.     ReDim result(size-1)  
  18.     Dim i As Integer   
  19.     ForAll e In array  
  20.         result(i)=e  
  21.         i=i+1  
  22.     End ForAll  
  23.       
  24.     ArrayToOneDimension=result  
  25. End Function 

86. LotusScript中的数组函数