收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 5180|回复: 7

[asp] asp实现ArrayList类(对数组的操作)

[复制链接]
发表于 2007-11-9 15:38:24 | 显示全部楼层 |阅读模式
asp中对数组的操作功能太弱,所以写了一个ArrayList类(参考c#中的ArrayList类),可以满足对数组操作的大部分功能.

对数组操作要注意的一些问题:
1,LBound()和UBound()是取得数组里最小的和最大的索引值,并不是数组的长度,
数组的长度是:UBound()+1
2,有时要动态改变数组大小,所以要先声明一个空的数组:
    Dim arr()
    使用这种方式声明的空数组如果用LBound()和UBound()取值的话会出现错误,但可以使用For Each:
    Dim arr()
    For Each v In arr
        Response.Write v
    Next
   这样就不会出错了

  另一种声明空数组的方法是:
   Dim arr
   arr=array()
   这样的话使用LBound(arr)和UBound(arr)则分别返回0和-1.


ArrayList类功能描述:

'***************ArrayList属性***************
'ArrayList.Length:数组长度
'***************ArrayList方法***************
'---数组添加:
'ArrayList.Add(v):在ArrayList尾部添加一个元素
'ArrayList.AddArray(arr):在ArrayList尾部附加一个数组
'ArrayList.Insert(index,v):在ArrayList的index处插入一个值,原先的index和之后的值都往后移
'ArrayList.InsertArray(index,arr):在ArrayList的index处插入一个数组,原先的index和之后的值都往后移
'---数组更新:
'ArrayList.Update(index,v):更新索引为index处的值
'---数组删除:
'ArrayList.Remove(v):从ArrayList中删除第一个匹配项,注意是第一个,将会得到一新的数组
'ArrayList.RemoveAt(index):移除ArrayList的指定索引处的元素,将会得到一新的数组
'ArrayList.Splice(m,n):从一个数组中移除从索引m到索引n的一段元素,并返回这段移除的数组
'ArrayList.Clear()清空数组,数组将变为空,长度Length=0
'---数组查找:
'ArrayList.IndexOf(v):查找,返回ArrayList第一个匹配项的索引。没找到返回-1。
'ArrayList.LastIndexOf(v):返回ArrayList的最后一个匹配项的索引。没找到返回-1。
'---返回数组中的值:
'ArrayList.GetValue(index)取得ArrayList某个索引的值
'ArrayList.Slice(m,n)返回ArrayList从m到n的一段数组
'ArrayList.GetArray()返回整个Array数组
'---数组其他操作:
'ArrayList.Reverse()将整个 ArrayList 中元素的顺序反转
'ArrayList.Implode(separator)返回字符串值,元素由指定的分隔符分隔开来
'******************************/


  1. <%
  2.         '/******************************
  3.         '类名:ArrayList
  4.         '名称:数组操作类
  5.         '日期:2007-11-6
  6.         '作者:西楼冷月
  7.         '网址:www.xilou.net | www.chinaCMS.org
  8.         '描述:对数组的各种操作
  9.         '版权:转载请注名出处,作者
  10.         '******************************
  11.         '最后修改:2007-11-6
  12.         '修改次数:0
  13.         '修改说明:
  14.         '目前版本:v1.0
  15.         '******************************/
  16. Class ArrayList

  17.         Private arrList'//内部数组
  18.         Private arrLength'//记录数组的长度
  19.        
  20.         Private Sub Class_Initialize()
  21.             arrList=Array()
  22.             arrLength=0
  23.         End Sub
  24.        
  25.         Private Sub Class_Terminate()
  26.             Erase arrList
  27.         End Sub
  28.        
  29.         '//数组长度,只读
  30.         Public Property Get Length
  31.             Length=arrLength
  32.         End Property
  33.        
  34.         '//取得某个索引的值
  35.         Public Function GetValue(index)
  36.             On Error Resume Next
  37.             GetValue=arrList(index)
  38.             If Err Then showErr "ArrayList.GetValue()"&Err.Description:Err.Clear:Exit Function
  39.         End Function
  40.        
  41.         '//返回整个Array数组
  42.         Public Function GetArray()
  43.             GetArray=arrList
  44.         End Function
  45.        
  46.         '//添加元素,将值添加到ArrayList的结尾处
  47.         Public Sub Add(v)
  48.             ReDim Preserve arrList(arrLength)
  49.             arrList(arrLength)=v
  50.             arrLength=arrLength+1
  51.         End Sub

  52.         '//将数组添加到ArrayList的结尾处
  53.         Public Sub AddArray(arr)
  54.             If Not IsArray(arr) Then showErr "参数不是数组(arr):ArrayList.AddArray()":Exit Sub
  55.             Dim I,L,J
  56.             On Error Resume Next
  57.                 If arrLength = 0 Then '//如果ArrayList为空则直接附值
  58.                     arrList=arr
  59.                     arrLength=arrLength+UBound(arr)+1
  60.                 Else
  61.                     L=arrLength+UBound(arr)'//新的数组长度
  62.                     J=0
  63.                     ReDim Preserve arrList(L)
  64.                     For I = arrLength To L
  65.                         arrList(I)=arr(J)
  66.                         J=J+1
  67.                     Next
  68.                     arrLength=arrLength+UBound(arr)+1
  69.                 End If
  70.             If Err Then showErr "ArrayList.AddArray()"&Err.Description:Err.Clear:Exit Sub
  71.             
  72.         End Sub

  73.         '//将元素插入ArrayList的指定index索引处,原有的arrList(index)及后面的元素都往后排
  74.         Public Sub Insert(index,v)
  75.             Dim I,v2
  76.             If index<arrLength And index>=0 Then
  77.                 ReDim Preserve arrList(arrLength)
  78.                 arrLength=arrLength+1
  79.                 For I = index To arrLength - 1
  80.                     v2=arrList(I)'//交换值
  81.                     arrList(I)=v
  82.                     v=v2
  83.                 Next
  84.             Else
  85.                 showErr "下标越界:ArrayList.Insert()"
  86.             End If
  87.         End Sub

  88.         '//将一组数组插入到指定的index处
  89.         Public Sub InsertArray(index,arr)
  90.             If index = "" Or Not IsNumeric(index) Then
  91.                 showErr "非法的参数:ArrayList.InsertArray()":Exit Sub
  92.             End If
  93.             If index < 0 Or index > arrLength-1 Then
  94.                 showErr "下标越界:ArrayList.InsertArray()":Exit Sub
  95.             End If
  96.             If Not IsArray(arr) Then showErr "参数不是数组:ArrayList.InsertArray()":Exit Sub
  97.             Dim I,L1,L2,J:J=0
  98.             On Error Resume Next
  99.             L1=UBound(arr)
  100.             L2=arrLength+L1
  101.             ReDim Preserve arrList(L2)
  102.             For I = arrLength -1 To index Step -1
  103.                 arrList(I+L1+1)=arrList(I)'//把index之后的值往后移
  104.             Next
  105.             For I = index To index+L1
  106.                 arrList(I)=arr(J)
  107.                 J=J+1
  108.             Next
  109.             If Err Then showErr "ArrayList.InsertArray()"&Err.Description:Err.Clear:Exit Sub
  110.             arrLength=arrLength+L1+1'//新的数组长度
  111.         End Sub

  112.         '//更新数组中索引为index的对应值
  113.         '//by xilou 39949376
  114.         Public Sub Update(index,v)
  115.             If index = "" Or Not IsNumeric(index) Then
  116.                 showErr "非法的参数(index):ArrayList.Update()":Exit Sub
  117.             End If
  118.             If index < 0 Or index > arrLength-1 Then
  119.                 showErr "下标越界(index):ArrayList.Update()":Exit Sub
  120.             End If
  121.             arrList(index)=v
  122.         End Sub
  123.        
  124.         '//从ArrayList中删除第一个匹配项,注意是第一个,将会得到一新的数组
  125.         Public Sub Remove(v)
  126.             Dim I,index
  127.             index = -1 '//第一个匹配的索引
  128.             For I = 0 To arrLength - 1
  129.                 If arrList(I)=v Then index = I : Exit For
  130.             Next
  131.             If index <> -1 Then
  132.                 For I = index To arrLength - 2
  133.                     arrList(I) = arrList(I+1)'//值向前填充
  134.                 Next
  135.                 ReDim Preserve arrList(arrLength-1)'//收缩数组
  136.                 arrLength = arrLength - 1
  137.             End If
  138.         End Sub

  139.         '//移除ArrayList的指定索引处的元素,将会得到一新的数组
  140.         Public Sub RemoveAt(index)
  141.             If index = "" Or Not IsNumeric(index) Then
  142.                 showErr "非法的参数(index):ArrayList.RemoveAt()":Exit Sub
  143.             End If
  144.             If index < 0 Or index > arrLength-1 Then
  145.                 showErr "下标越界(index):ArrayList.RemoveAt()":Exit Sub
  146.             End If
  147.             If index > 0 Then
  148.                 For I = index To arrLength - 2
  149.                     arrList(I) = arrList(I+1)'//值向前填充
  150.                 Next
  151.                 ReDim Preserve arrList(arrLength-1)'//收缩数组
  152.                 arrLength = arrLength - 1
  153.             End If
  154.         End Sub

  155.         '//从一个数组中移除从索引m到索引n的一段元素,并返回这段移除的数组
  156.         Public Function Splice(m,n)
  157.             If m = "" Or n = "" Or Not IsNumeric(m) Or Not IsNumeric(n) Then
  158.                 showErr "非法的参数(m,n):ArrayList.Splice()":Exit Function
  159.             End If
  160.             If m < 0 Or m > arrLength-1 Or n < 0 Or n > arrLength-1 Then
  161.                 showErr "下标越界(m,n):ArrayList.Splice()":Exit Function
  162.             End If
  163.             Dim newArr,x,L,I,J
  164.             newArr=Array()
  165.             If m > n Then x=m:m=n:n=x '//交换数值
  166.             L=n-m
  167.             ReDim Preserve newArr(L)
  168.             For I = m To n
  169.                 newArr(J)=arrList(I)'要移除的元素
  170.                 J=J+1
  171.             Next
  172.             '//把n后面的元素的值移前
  173.             For I = (n+1) To arrLength -1
  174.                 arrList(I-L-1)=arrList(I)
  175.             Next
  176.             arrLength=arrLength-L-1
  177.             ReDim Preserve arrList(arrLength)
  178.             Splice=newArr
  179.         End Function

  180.         '//清空数组,数组将变为空,长度Length=0
  181.         Public Sub Clear()
  182.             Erase arrList
  183.             arrLength=0
  184.         End Sub

  185.         '//将整个 ArrayList 中元素的顺序反转
  186.         Public Sub Reverse()
  187.             Dim L,I,J,v
  188.             J=arrLength-1
  189.             If arrLength > 0 Then
  190.                 L=Int(arrLength/2)
  191.                 For I = 0 To L-1
  192.                     v=arrList(I)
  193.                     arrList(I)=arrList(J)
  194.                     arrList(J)=v
  195.                     J=J-1
  196.                 Next
  197.             End If
  198.         End Sub

  199.         '//返回字符串值,其中包含了连接到一起的数组的所有元素,元素由指定的分隔符分隔开来
  200.         Public Function Implode(separator)
  201.             Implode=Join(arrList,separator)
  202.         End Function

  203.         '//返回ArrayList从m到n的一段数组
  204.         Public Function Slice(m,n)
  205.             If m = "" Or n = "" Or Not IsNumeric(m) Or Not IsNumeric(n) Then
  206.                 showErr "非法的参数:ArrayList.Slice()":Exit Function
  207.             End If
  208.             If m < 0 Or m > arrLength-1 Or n < 0 Or n > arrLength-1 Then
  209.                 showErr "下标越界:ArrayList.Slice()":Exit Function
  210.             End If
  211.             Dim I,J,newArr()
  212.             J=0
  213.             If m<=n Then
  214.                 ReDim Preserve newArr(n-m)
  215.                 For I = m To n
  216.                     newArr(J)=arrList(I)
  217.                     J=J+1
  218.                 Next
  219.             Else
  220.                 ReDim Preserve newArr(m-n)
  221.                 For I = n To m
  222.                     newArr(J)=arrList(I)
  223.                     J=J+1
  224.                 Next
  225.             End If
  226.             Slice=newArr
  227.             Erase newArr
  228.         End Function
  229.        
  230.         '//查找,返回ArrayList第一个匹配项的从零开始的索引。没找到返回-1。
  231.         '//by xilou 39949376
  232.         Public Function IndexOf(v)
  233.             Dim I
  234.             For I = 0 To arrLength - 1
  235.                 If arrList(I)=v Then IndexOf=I:Exit Function
  236.             Next
  237.             IndexOf=-1
  238.         End Function

  239.         '//返回ArrayList的最后一个匹配项的从零开始的索引。没找到返回-1。
  240.         Public Function LastIndexOf(v)
  241.             Dim I
  242.             If arrLength=0 Then
  243.                 LastIndexOf=-1:Exit Function
  244.             Else
  245.                 For I = (arrLength-1) To 0 Step -1
  246.                     If arrList(I)=v Then LastIndexOf=I:Exit Function
  247.                 Next
  248.             End If
  249.             LastIndexOf=-1
  250.         End Function
  251.        
  252.         '//显示错误
  253.         Private Sub showErr(errInfo)
  254.             Response.Write "<div id=""ERRORINFO"" style=""font-size:12px;color:#990000;font-family:""新宋体"", Arial"">"
  255.             Response.Write errInfo
  256.             Response.Write "</div>"
  257.             Response.End()
  258.         End Sub
  259. End Class
  260. %>

复制代码


更详细和帮助文档请看:http://www.chinacms.org/article.asp?id=65

评分

参与人数 1威望 +2 收起 理由
帅青蛙 + 2 原创内容

查看全部评分

发表于 2007-11-9 19:04:59 | 显示全部楼层
很不错,,楼主ASP功力深厚啊。。

还有一事想请教楼主,请问你博客里面的,模板标签类如何使用呢?

可以给我个例子吗??最近在学习代码页面分离

可以的话把例子发给我一份吧

37992553@qq.com
回复 支持 反对

使用道具 举报

发表于 2007-11-9 21:06:26 | 显示全部楼层
原帖由 [i]xilou 于 2007-11-9 15:38 发表
asp中对数组的操作功能太弱,所以写了一个ArrayList类(参考c#中的ArrayList类),可以满足对数组操作的大部分功能.

不是asp对数组的操作功能太弱,而是vbscript对数组的操作功能太弱。asp+jscript 则没有这个问题,所以有必要更正楼主的这个观点。
回复 支持 反对

使用道具 举报

发表于 2007-11-10 02:15:30 | 显示全部楼层
比Dictionary好在哪里?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-10 09:23:14 | 显示全部楼层

^^

To mickeyboy :谢谢纠正!

To 5do8 :比Dictionary差点,不够Dictionary灵活, 我写这个的目的只是用来操作数组,我只能说他们各有各的用处...

To kv163 :已PM~~~
回复 支持 反对

使用道具 举报

发表于 2007-11-10 19:24:50 | 显示全部楼层
谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2007-11-10 21:40:11 | 显示全部楼层
原帖由 [i]mickeyboy 于 2007-11-9 21:06 发表

不是asp对数组的操作功能太弱,而是vbscript对数组的操作功能太弱。asp+jscript 则没有这个问题,所以有必要更正楼主的这个观点。



非常同意。这位仁兄的观点,,


换用javascript做为Asp的脚本语言,就不会出现这种问题。
回复 支持 反对

使用道具 举报

发表于 2007-11-10 23:54:23 | 显示全部楼层
原帖由 [i]faeng220 于 2007-11-10 21:40 发表



非常同意。这位仁兄的观点,,


换用javascript做为Asp的脚本语言,就不会出现这种问题。


COM的DICTIONARY效率差点 也够用了
jscript(是这么拼吧)效率未必高哪里去又.....

BTW://楼主这篇文章对初学数组的同学还是很有用的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-6-3 07:46 , Processed in 0.109102 second(s), 13 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表