2011-01-05 26 views
37

VBScriptの既存の配列に項目を追加するにはどうすればよいですか?VBScriptの配列に項目を追加する

Javascriptのpush関数に相当するVBScriptはありますか?

すなわち

myarrayのは3つの項目、「りんご」、「オレンジ」、および「バナナ」を持って、私は、配列の末尾に「スイカ」を追加します。

答えて

55

VBScriptでは、配列はあまり動的ではありません。それは余分なアイテムを収納できるように、既存のアレイを成長させるReDim Preserveステートメントを使用する必要があります:

ReDim Preserve yourArray(UBound(yourArray) + 1) 
yourArray(UBound(yourArray)) = "Watermelons" 
+0

おかげのように使用

' add item to array Function AddItem(arr, val) ReDim Preserve arr(UBound(arr) + 1) arr(UBound(arr)) = val AddItem = arr End Function 

を和らげます! – Choy

+6

'Redim Preserve'は、使用するたびに配列全体をコピーすることに注意してください。つまり、big-O表記ではn ** 2の複雑さがあります。 – mgr326639

+0

@user、配列全体をコピーするには二次的ではなく線形の複雑さ( 'O(n)')があります( 'O(n²)')。 –

9

カスタムCOMまたはActiveXオブジェクト

  1. ReDimステートメントを含まないいくつかの方法がありますが、文字列のキーを持つことができ、
  2. Dictionaryオブジェクトを保持し、
  3. ArrayListを含む多くの方法がある.NET Frameworkクラス、それらを検索: ソート(フォワード、リバース、カスタム)、挿入、削除を、 binarysearch、等しく、内のtoArray、以下のコードでのtoString

、私はREDIM保護区見つけ最速54000以下で、辞書には、690000から54000から最速で、アレイリストは690000.上最速である私が使用する傾向があります並べ替えと配列変換のためにプッシュするためのArrayList

user326639 FastArrayを提供しました。これはかなり早いです。

辞書は、値を検索してインデックスを返す(フィールド名)、グループ化と集約(ヒストグラム、グループと追加、グループと連結文字列、グループとプッシュサブアレイ)に役立ちます。キーをグループ化するときは、大文字/小文字の区別のためにCompareModeを設定し、「追加」の前に「存在」プロパティをチェックします。

Redimで1つの配列に時間を節約することはできませんが、配列の辞書には便利です。上記からFastArrayへ

'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] 
+3

このコードを追加することをお勧めします:t0 = timer '高速配列 a = array() i = 0の場合i = 0の場合 ub = UBound(a) もしi> ubならばReDim Preserve a(Int( (Timer-t0、3、-1)& "]) a(i)= value ReDim Preserve a(i-1) s ="& "[FastArr"&FormatNumber " a = Nothingを設定 – mgr326639

+0

ありがとう! – Will

+0

@ mgr326639最後の「ReDim Preserve a(i-1)」とは何ですか? – sirdank

3

わずかな変化:

'pushtest.vbs 
imax = 10000000 
value = "Testvalue" 
s = imax & " of """ & value & """" 

t0 = timer 'Fast array 
a = array() 
ub = UBound(a) 
For i = 0 To imax 
If i>ub Then 
    ReDim Preserve a(Int((ub+10)*1.1)) 
    ub = UBound(a) 
End If 
a(i) = value 
Next 
ReDim Preserve a(i-1) 
s = s & "[FastArr " & FormatNumber(timer - t0, 3, -1) & "]" 

MsgBox s 

我々はそれが変化したときに正確にわかっている場合のためのすべてのサイクルでUBound(a)をチェックしても意味がありません。それがチェックされるように

私はそれを変更した私のコンピュータ上でUBound(a)直前のために開始され、その後、ReDim

と呼ばれている唯一のたびに古い方法は、10百万人のIMAX用に7.52秒かかったん。

新しいメソッドには5が必要でした。10秒間でパフォーマンスが向上することを意味する29秒(10百万回の試行で、明らかにこの割合は試行回数と直接関係します)

0

これは遅いですが、とにかくそれはまた、ややトリッキー

dim arrr 
    arr= array ("Apples", "Oranges", "Bananas") 
dim temp_var 
temp_var = join (arr , "||") ' some character which will not occur is regular strings 
if len(temp_var) > 0 then 
    temp_var = temp_var&"||Watermelons" 
end if 
arr = split(temp_var , "||") ' here you got new elemet in array ' 
for each x in arr 
response.write(x & "<br />") 
next' 

レビューであり、これは を働かせることができるか、最初にあなたは、配列

0

ない答えそれともなぜ "trickyの文字列以降の分割内のすべてのデータを保存する場合は教えてください「悪いです:

>> a = Array(1) 
>> a = Split(Join(a, "||") & "||2", "||") 
>> WScript.Echo a(0) + a(1) 
>> 
12 
4

あなたのコピー&ペーストのために助けを求めるように

a = Array() 
a = AddItem(a, 5) 
a = AddItem(a, "foo") 
関連する問題