(原创)同Scripting.Dictionary等价的字典类

原创 2004年08月19日 10:04:00

写此类的原因是因为个人所写的"模版类".,因为很多免费的个人主页空间(因为阿拉穷啊,没钱买空间啊=.=)都不提供FSO.所以导致Scripting.Dictionary也不能使用,所以那"模版类"就不能运行了.于是就有了自己写一个"字典类"的念头.

此类同Scripting.Dictionary对象的使用没有任何的区别,所以以前是根据Scripting.Dictionary来写的程序,不用怎样的修改就可以使用到此类上.此类并且还比Scripting.Dictionary多了一个Insert方法:Insert(sKey,nKey,nval,nMethod),此方法是将新字典数据插入到存在的以sKey为Key的字典位置.nKey,nVal是新字典数据的Key值和Value值.nMethod则是插入的位置.如果此值为1,"b","black"或空值,则是插入到以sKey为Key的字典数据后面,否则前面.

代码如下:

'/*====================字典对象类============================================
'/*作者:死在水中的鱼
'/*日期:2004年7月14日.晚
'/*Blog:http://blog.lznews.cn/blog.asp?name=哇哇鱼
'/*版本:1.00 
'/*用法:
'/*Dim objDic,sKey,I,sValue
'/*Set objDic=New DictionaryClass
'/*Add方法:Add(字典的Key值,字典数据)    说明:如果"字典的Key值"已存在则Add方法失败
'/*objDic.Add "a","字母a"       'Add方法
'/*objDic.Add "b","字母b"    
'/*objDic.Add "c","字母c"
'/*'Insert方法:Insert(被插入位置的Key值,新的字典Key值,新的字典数据,插入方式:b后面,f前面)
'/*objDic.Insert "a","aa","字母aa","b"   
'/*objDic.Insert "b","bb","字母bb","f"
'/*'Exists方法,返回是否存在以"b"为Key值的字典数据
'/*Response.Write objDic.Exists("b")
'/*sKey=objDic.Keys             '获取Keys集合,(数组集合)
'/*sValue=objDic.Items          '获取字典数据集合(数组集合)
'/*objDic.Item("a")="aaaaaa"    'Item属性方法:返回或设置对应Key的字典数据
'/*For I=0 To objDic.Count-1    'Count属性返回有多少条字典数据
'/*    'Item属性方法:返回或设置对应Key的字典数据
'/*    Response.Write objDic.Item(sKey(I))&"<br>"
'/*Next
'/*Remove方法:Remove(字典的Key值)
'/*objDic.Remove("a")           '删除Key值为a的字典数据
'/*objDic.RemoveAll             '清空字典数据
'/*objDic.ErrCode               '返回操作字典时的一些错误代码(调试时用)
'/*objDic.ClearErr              '清空错误代码(调试时用)
'/*Set objDic=nothing
'/*说明:
'/*"字典的Key值":除了Add方法外,都可以用字符串或序数(1,2..)使用
'/* 转载时或修改时,请尊重作者的知识产权,保留此说明!
'/*==========================================================================
Class DictionaryClass
Dim ArryObj()        '使用该二维数组来做存放数据的字典
Dim MaxIndex          'MaxIndex则是ArryObj开始的最大上标
Dim CurIndex          '字典指针,用来指向ArryObj的指针
Dim C_ErrCode           '错误代码号

Private Sub Class_Initialize
  CurIndex=0          '从下标0开始
  C_ErrCode=0           '0表示没有任何错误
  MaxIndex=50         '默认的大小
  Redim ArryObj(1,MaxIndex)   '定义一个二维的数组
End Sub

Private Sub Class_Terminate 
 Erase ArryObj    '清除数组
End Sub

Public Property Get ErrCode  '返回错误代码
   ErrCode=C_ErrCode
End Property

Public Property Get Count    '返回数据的总数,只返回CurIndex当前值-1即可.
   Count=CurIndex
End Property

Public Property Get Keys     '返回字典数据的全部Keys,返回数组.
   Dim KeyCount,ArryKey(),I
   KeyCount=CurIndex-1
   Redim ArryKey(KeyCount)
   For I=0 To KeyCount
       ArryKey(I)=ArryObj(0,I)
   Next
   Keys=ArryKey
   Erase ArryKey
End Property

Public Property Get Items    '返回字典数据的全部Values,返回数组.
   Dim KeyCount,ArryItem(),I
   KeyCount=CurIndex-1
   Redim ArryItem(KeyCount)
   For I=0 To KeyCount
      If isObject(ArryObj(1,I)) Then
         Set ArryItem(I)=ArryObj(1,I)
   Else
      ArryItem(I)=ArryObj(1,I)
   End If
   Next
   Items=ArryItem
   Erase ArryItem
End Property


Public Property Let Item(sKey,sVal)  '取得sKey为Key的字典数据
   If sIsEmpty(sKey) Then
   Exit Property
   End If
   Dim i,iType
   iType=GetType(sKey)
   If iType=1 Then  '如果sKey为数值型的则检查范围
     If sKey>CurIndex Or sKey<1 Then
   C_ErrCode=2
      Exit Property
  End If
   End If
   If iType=0 Then
     For i=0 to CurIndex-1
       If ArryObj(0,i)=sKey Then
       If isObject(sVal) Then
          Set ArryObj(1,i)=sVal
    Else
       ArryObj(1,i)=sVal
    End If
    Exit Property
    End If
     Next
   ElseIf iType=1 Then
          sKey=sKey-1
       If isObject(sVal) Then
          Set ArryObj(1,sKey)=sVal
    Else
       ArryObj(1,sKey)=sVal
    End If
    Exit Property
   End If
   C_ErrCode=2            'ErrCode为2则是替换或个为sKey的字典数据时找不到数据
End Property

Public Property Get Item(sKey)
   If sIsEmpty(sKey) Then
      Item=Null
   Exit Property
   End If
   Dim i,iType
   iType=GetType(sKey)
   If iType=1 Then  '如果sKey为数值型的则检查范围
     If sKey>CurIndex Or sKey<1 Then
      Item=Null
   Exit Property
  End If
   End If
   If iType=0 Then
     For i=0 to CurIndex-1
       If ArryObj(0,i)=sKey Then
       If isObject(ArryObj(1,i)) Then
          Set Item=ArryObj(1,i)
    Else
       Item=ArryObj(1,i)
    End If
    Exit Property
    End If
     Next
   ElseIf iType=1 Then
          sKey=sKey-1
       If isObject(ArryObj(1,sKey)) Then
          Set Item=ArryObj(1,sKey)
    Else
       Item=ArryObj(1,sKey)
    End If
    Exit Property
   End If
   Item=Null
End Property

Public Sub Add(sKey,sVal)  '添加字典
    'On Error Resume Next
    If Exists(sKey) Or C_ErrCode=9 Then
    C_ErrCode=1                 'Key值不唯一(空的Key值也不能添加数字)
    Exit Sub
 End If
    If CurIndex>MaxIndex Then
    MaxIndex=MaxIndex+1         '每次增加一个标数,可以按场合需求改为所需量
    Redim Preserve ArryObj(1,MaxIndex)
 End If
 ArryObj(0,CurIndex)=Cstr(sKey)       'sKey是标识值,将Key以字符串类型保存
 if isObject(sVal) Then
    Set ArryObj(1,CurIndex)=sVal       'sVal是数据
 Else
    ArryObj(1,CurIndex)=sVal       'sVal是数据
 End If
 CurIndex=CurIndex+1
End Sub

'/*==========================================================================
'/*函数作用:插入新的字典数据
'/*参数:sKey=被插入的Key值  nKey=新字典的Key值  nVal=新字典的数据
'/*     sMethod=插入的方式{1,"b","back"}=在sKey的后面位置插入新数据,其它则是前面
'/*==========================================================================
Public Sub Insert(sKey,nKey,nVal,sMethod)
 If Not Exists(sKey) Then
    C_ErrCode=4
    Exit Sub
 End If
    If Exists(nKey) Or C_ErrCode=9 Then
    C_ErrCode=4                 'Key值不唯一(空的Key值也不能添加数字)
    Exit Sub
 End If
 sType=GetType(sKey)              '取得sKey的变量类型
 Dim ArryResult(),I,sType,subIndex,sAdd
 ReDim ArryResult(1,CurIndex)   '定义一个数组用来做临时存放地
 if sIsEmpty(sMethod) Then sMethod="b"    '为空的数据则默认是"b"
 sMethod=lcase(cstr(sMethod))
 subIndex=CurIndex-1
 sAdd=0
 If sType=0 Then                  '字符串类型比较
   If sMethod="1" Or sMethod="b" Or sMethod="back" Then '将数据插入sKey的后面
        For I=0 TO subIndex
           ArryResult(0,sAdd)=ArryObj(0,I)
     If IsObject(ArryObj(1,I)) Then
       Set ArryResult(1,sAdd)=ArryObj(1,I)
     Else
       ArryResult(1,sAdd)=ArryObj(1,I)
     End If
     If ArryObj(0,I)=sKey Then  '插入数据
       sAdd=sAdd+1
       ArryResult(0,sAdd)=nKey
    If IsObject(nVal) Then
      Set ArryResult(1,sAdd)=nVal
    Else
      ArryResult(1,sAdd)=nVal
    End If
     End If
     sAdd=sAdd+1
     Next
   Else
        For I=0 TO subIndex
     If ArryObj(0,I)=sKey Then  '插入数据
       ArryResult(0,sAdd)=nKey
    If IsObject(nVal) Then
      Set ArryResult(1,sAdd)=nVal
    Else
      ArryResult(1,sAdd)=nVal
    End If
    sAdd=sAdd+1
     End If
     ArryResult(0,sAdd)=ArryObj(0,I)
     If IsObject(ArryObj(1,I)) Then
       Set ArryResult(1,sAdd)=ArryObj(1,I)
     Else
       ArryResult(1,sAdd)=ArryObj(1,I)
     End If
     sAdd=sAdd+1
     Next
   End If
 ElseIf sType=1 Then
   sKey=sKey-1                    '减1是为了符合日常习惯(从1开始)
   If sMethod="1" Or sMethod="b" Or sMethod="back" Then '将数据插入sKey的后面
        For I=0 TO sKey              '取sKey前面部分数据
           ArryResult(0,I)=ArryObj(0,I)
     If IsObject(ArryObj(1,I)) Then
       Set ArryResult(1,I)=ArryObj(1,I)
     Else
       ArryResult(1,I)=ArryObj(1,I)
     End If
     Next
  '插入新的数据
  ArryResult(0,sKey+1)=nKey
  If IsObject(nVal) Then
     Set ArryResult(1,sKey+1)=nVal
  Else
     ArryResult(1,sKey+1)=nVal
  End If
  '取sKey后面的数据
        For I=sKey+1 TO subIndex
           ArryResult(0,I+1)=ArryObj(0,I)
     If IsObject(ArryObj(1,I)) Then
       Set ArryResult(1,I+1)=ArryObj(1,I)
     Else
       ArryResult(1,I+1)=ArryObj(1,I)
     End If
     Next
   Else
        For I=0 TO sKey-1              '取sKey-1前面部分数据
           ArryResult(0,I)=ArryObj(0,I)
     If IsObject(ArryObj(1,I)) Then
       Set ArryResult(1,I)=ArryObj(1,I)
     Else
       ArryResult(1,I)=ArryObj(1,I)
     End If
     Next
  '插入新的数据
  ArryResult(0,sKey)=nKey
  If IsObject(nVal) Then
     Set ArryResult(1,sKey)=nVal
  Else
     ArryResult(1,sKey)=nVal
  End If
  '取sKey后面的数据
        For I=sKey TO subIndex
           ArryResult(0,I+1)=ArryObj(0,I)
     If IsObject(ArryObj(1,I)) Then
       Set ArryResult(1,I+1)=ArryObj(1,I)
     Else
       ArryResult(1,I+1)=ArryObj(1,I)
     End If
     Next
   End If
 Else
   C_ErrCode=3
   Exit Sub
 End If
 ReDim ArryObj(1,CurIndex)  '重置数据
 For I=0 To CurIndex
  ArryObj(0,I)=ArryResult(0,I)
  If isObject(ArryResult(1,I)) Then
     Set ArryObj(1,I)=ArryResult(1,I)
  Else
     ArryObj(1,I)=ArryResult(1,I)
  End If
 Next
 MaxIndex=CurIndex
 Erase ArryResult
 CurIndex=CurIndex+1      'Insert后数据指针加一
End Sub

Public Function Exists(sKey)   '判断存不存在某个字典数据
    If sIsEmpty(sKey) Then
       Exists=False
       Exit Function
 End If
 Dim I,vType
 vType=GetType(sKey)
 If vType=0 Then
   For I=0 To CurIndex-1
     If ArryObj(0,I)=sKey Then
     Exists=True
     Exit Function
  End If
   Next
 ElseIf vType=1 Then
      If sKey<=CurIndex And sKey>0 Then
      Exists=True
      Exit Function
   End If
 End If
 Exists=False
End Function

Public Sub Remove(sKey)              '根据sKey的值Remove一条字典数据
 If Not Exists(sKey) Then
    C_ErrCode=3
    Exit Sub
 End If
 sType=GetType(sKey)              '取得sKey的变量类型
 Dim ArryResult(),I,sType,sAdd
 ReDim ArryResult(1,CurIndex-2)   '定义一个数组用来做临时存放地
 sAdd=0
 If sType=0 Then                  '字符串类型比较
      For I=0 TO CurIndex-1
     If ArryObj(0,I)<>sKey Then
           ArryResult(0,sAdd)=ArryObj(0,I)
     If IsObject(ArryObj(1,I)) Then
       Set ArryResult(1,sAdd)=ArryObj(1,I)
     Else
       ArryResult(1,sAdd)=ArryObj(1,I)
     End If
     sAdd=sAdd+1
  End If
   Next
 ElseIf sType=1 Then
   sKey=sKey-1                    '减1是为了符合日常习惯(从1开始)
      For I=0 TO CurIndex-1
     If I<>sKey Then
           ArryResult(0,sAdd)=ArryObj(0,I)
     If IsObject(ArryObj(1,I)) Then
       Set ArryResult(1,sAdd)=ArryObj(1,I)
     Else
       ArryResult(1,sAdd)=ArryObj(1,I)
     End If
     sAdd=sAdd+1
  End If
   Next
 Else
   C_ErrCode=3
   Exit Sub
 End If
 MaxIndex=CurIndex-2
 ReDim ArryObj(1,MaxIndex)  '重置数据
 For I=0 To MaxIndex
  ArryObj(0,I)=ArryResult(0,I)
  If isObject(ArryResult(1,I)) Then
     Set ArryObj(1,I)=ArryResult(1,I)
  Else
     ArryObj(1,I)=ArryResult(1,I)
  End If
 Next
 Erase ArryResult
 CurIndex=CurIndex-1      '减一是Remove后数据指针
End Sub

Public Sub RemoveAll  '全部清空字典数据,只Redim一下就OK了
    Redim ArryObj(MaxIndex)
 CurIndex=0
End Sub

Public Sub ClearErr   '重置错误
    C_ErrCode=0
End Sub

Private Function sIsEmpty(sVal)  '判断sVal是否为空值
    If IsEmpty(sVal) Then
    C_ErrCode=9                 'Key值为空的错误代码
    sIsEmpty=True
    Exit Function
 End If
    If IsNull(sVal) Then
    C_ErrCode=9                 'Key值为空的错误代码
    sIsEmpty=True
    Exit Function
 End If
    If Trim(sVal)="" Then
    C_ErrCode=9                 'Key值为空的错误代码
    sIsEmpty=True
    Exit Function
 End If
 sIsEmpty=False
End Function

Private Function GetType(sVal)     '取得变量sVal的变量类型
    dim sType
 sType=TypeName(sVal)
    Select Case sType
    Case "String"
       GetType=0
    Case "Integer","Long","Single","Double"
       GetType=1
    Case Else
       GetType=-1
 End Select
End Function

End Class

分享一个比较有意思的字典相等比较扩展方法DictionaryEqual

在stackoverflow上看到一个比较有意思的字典相等比较扩展方法,感觉思路比较巧妙,于是在这里转载下 PS:原方法不包含IEqualityComparer keyComparer,此处将此问题...
  • starfd
  • starfd
  • 2015年07月15日 22:36
  • 2087

TRIZ系列-创新原理-27-一次性用品原理

一次性用品原理也叫廉价替代品原理,其具体表述如下:1)用廉价物品替代昂贵物品,在某些属性上作出妥协;某些系统或部件很昂贵,不利于推广,在质量允许的前提下,对某些属性做些妥协,用廉价的物品替代就不失为一...
  • hawksoft
  • hawksoft
  • 2014年10月24日 20:03
  • 2700

测试相关理解(一)等价类划分法

从测试原理上分为:白盒测试、黑盒测试和灰盒测试。 白盒测试:是通过程序的源代码进行测试而不使用用户界面。这种类型的测试需要从代码句法发现内部代码在算法,溢出,路径,条件等等中的缺点或者错误,进而加以修...
  • hello_myhome
  • hello_myhome
  • 2015年06月19日 09:31
  • 1607

asp中Scripting.Dictionary字典对象使用示例

vbscript的Scripting.Dictionary创建了类似于Key索引对应Value值的字典对象,通过Key直接索引到指定的Value。 VBScript中Scripting.Dictio...
  • bianjing40
  • bianjing40
  • 2015年10月22日 21:00
  • 790

C#中的Dictionary字典类介绍

说明     必须包含名空间System.Collection.Generic      Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)      键必须是唯一的,而值不...
  • taotaoah
  • taotaoah
  • 2016年04月27日 15:15
  • 197

C#中的Dictionary字典类介绍

说明     必须包含名空间System.Collection.Generic     Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)     键必须是唯一的,...
  • james_1234
  • james_1234
  • 2013年03月22日 09:25
  • 239

C#中的Dictionary字典类介绍

关键字:C# Dictionary 字典 作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dictionar...
  • qq_36215025
  • qq_36215025
  • 2017年03月10日 17:07
  • 105

C#中的Dictionary字典类介绍

必须包含名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值) 键必须是唯一的,而值不需要唯一的 ...
  • heyuchang666
  • heyuchang666
  • 2016年01月12日 13:07
  • 698

C#中的Dictionary字典类介绍

关键字:C# Dictionary 字典  作者:txw1958 原文:http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dicti...
  • QingHeShiJiYuan
  • QingHeShiJiYuan
  • 2016年03月11日 15:33
  • 292

C#中的Dictionary字典类介绍

关键字:C# Dictionary 作者:txw1958 原文:http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dictionar...
  • AnYuanLzh
  • AnYuanLzh
  • 2012年12月07日 10:33
  • 1581
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(原创)同Scripting.Dictionary等价的字典类
举报原因:
原因补充:

(最多只允许输入30个字)