Có một vài cách khác nhau, chưa kể một COM tùy chỉnh hoặc đối tượng ActiveX
- ReDim Bảo tồn
- Đối tượng từ điển, có thể có các phím chuỗi và tìm kiếm chúng
- ArrayList .Net Framework Class, có nhiều phương pháp bao gồm: sắp xếp (chuyển tiếp, đảo ngược, tùy chỉnh), chèn, xóa, binarysearch, bằng, toArray, và toString
Với mã dưới đây, tôi thấy Redim Preserve nhanh nhất dưới đây 54000, từ điển là nhanh nhất 54.000-690,000, và mảng Danh sách là nhanh nhất trên 690000. Tôi có xu hướng sử dụng ArrayList để đẩy vì chuyển đổi sắp xếp và mảng.
user326639 cung cấp FastArray, nhanh hơn rất nhiều.
Từ điển hữu ích để tìm kiếm giá trị và trả về chỉ mục (ví dụ: tên trường) hoặc nhóm và tổng hợp (biểu đồ, nhóm và thêm, nhóm và nối chuỗi, nhóm và đẩy mảng phụ). Khi nhóm trên các phím, hãy đặt CompareMode cho trường hợp trong/độ nhạy và kiểm tra thuộc tính "tồn tại" trước khi "thêm" -ing.
Redim sẽ không tiết kiệm được nhiều thời gian cho một mảng, nhưng nó hữu ích cho từ điển của mảng.
'pushtest.vbs
imax = 10000
value = "Testvalue"
s = imax & " of """ & value & """"
t0 = timer 'ArrayList Method
Set o = CreateObject("System.Collections.ArrayList")
For i = 0 To imax
o.Add value
Next
s = s & "[AList " & FormatNumber(timer - t0, 3, -1) & "]"
Set o = Nothing
t0 = timer 'ReDim Preserve Method
a = array()
For i = 0 To imax
ReDim Preserve a(UBound(a) + 1)
a(UBound(a)) = value
Next
s = s & "[ReDim " & FormatNumber(timer - t0, 3, -1) & "]"
Set a = Nothing
t0 = timer 'Dictionary Method
Set o = CreateObject("Scripting.Dictionary")
For i = 0 To imax
o.Add i, value
Next
s = s & "[Dictionary " & FormatNumber(timer - t0, 3, -1) & "]"
Set o = Nothing
t0 = timer 'Standard array
Redim a(imax)
For i = 0 To imax
a(i) = value
Next
s = s & "[Array " & FormatNumber(timer - t0, 3, -1) & "]" & vbCRLF
Set a = Nothing
t0 = timer 'Fast array
a = array()
For i = 0 To imax
ub = UBound(a)
If i>ub Then ReDim Preserve a(Int((ub+10)*1.1))
a(i) = value
Next
ReDim Preserve a(i-1)
s = s & "[FastArr " & FormatNumber(timer - t0, 3, -1) & "]"
Set a = Nothing
MsgBox s
' 10000 of "Testvalue" [ArrayList 0.156][Redim 0.016][Dictionary 0.031][Array 0.016][FastArr 0.016]
' 54000 of "Testvalue" [ArrayList 0.734][Redim 0.672][Dictionary 0.203][Array 0.063][FastArr 0.109]
' 240000 of "Testvalue" [ArrayList 3.172][Redim 5.891][Dictionary 1.453][Array 0.203][FastArr 0.484]
' 690000 of "Testvalue" [ArrayList 9.078][Redim 44.785][Dictionary 8.750][Array 0.609][FastArr 1.406]
'1000000 of "Testvalue" [ArrayList 13.191][Redim 92.863][Dictionary 18.047][Array 0.859][FastArr 2.031]
cảm ơn vì sự giúp đỡ! – Choy
Hãy lưu ý rằng 'Redim Preserve' sao chép toàn bộ mảng mỗi khi bạn sử dụng nó. Nói cách khác nó có n ** 2 phức tạp trong ký hiệu big-O. – mgr326639
@user, sao chép toàn bộ mảng có độ phức tạp tuyến tính ('O (n)'), không phải bậc hai ('O (n²)'). –