2011-01-05 25 views
37

¿Cómo se agrega un elemento a una matriz existente en VBScript?Agregar elemento a la matriz en VBScript

¿Hay un VBScript equivalente a la función push en Javascript?

decir

miMatriz tiene tres elementos, "Manzanas", "naranjas", y "Bananas" y quiero añadir "sandías" al final de la matriz.

Respuesta

55

Las matrices no son muy dinámicas en VBScript. Vas a tener que utilizar la instrucción ReDim Preserve hacer crecer la matriz existente para que pueda dar cabida a un elemento adicional:

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

gracias por la ayuda! – Choy

+6

Tenga en cuenta que 'Redim Preserve' copia toda la matriz cada vez que la usa. En otras palabras, tiene n ** 2 complejidad en la notación de O grande. – mgr326639

+0

@user, copiar toda la matriz tiene una complejidad lineal ('O (n)'), no cuadrática ('O (n²)'). –

9

Hay algunas maneras, sin incluir una costumbre o COM objeto ActiveX

  1. ReDim preservar
  2. objeto Dictionary, que puede tener claves de las cadenas y la búsqueda de ellos
  3. ArrayList clases de .NET Framework, que tiene muchos métodos, incluyendo: especie (adelante, atrás, a medida), insertar, eliminar, binarySearch, es igual, toArray y toString

Con el código de abajo, me encontré con ReDim Preserve es más rápido por debajo de 54000, diccionario es Reducción del tiempo entre 54000 a 690000, y la lista de matriz se hace más rápido por encima de 690000. tiendo a utilizar ArrayList para empujar debido a la clasificación y la conversión de matriz.

user326639 proporcionan FastArray, que es bastante rápido.

Los diccionarios son útiles para buscar el valor y devolver el índice (es decir, nombres de campo) o para agrupar y agregar (histogramas, agrupar y agregar, agrupar y concatenar cadenas, agrupar y empujar sub-arreglos). Al agrupar en claves, establezca CompareMode para case in/sensitivity, y verifique la propiedad "exists" antes de "add" -ing.

Redim no ahorraría mucho tiempo para una matriz, pero es útil para un diccionario de matrices.

'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

Le sugiero que agregue este fragmento de código: t0 = timer 'Fast array a = array() Para i = 0 A imax ub = UBound (a) If i> ub Then ReDim Preserve a (Int ((ub + 10) * 1.1)) a (i) = valor Siguiente ReDim Preserve un (i-1) s = s & "[FastArr" & FormatNumber (timer - t0, 3, -1) & "] " Establecer a = Nada – mgr326639

+0

Gracias! Nunca hubiera podido pensar en eso – Will

+0

@ mgr326639 ¿Qué pasa con el 'ReDim Preserve a (i-1)' final? – sirdank

3

Ligero cambio a la FastArray desde arriba:

'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 

No hay ningún punto en la comprobación de UBound(a) en cada ciclo de la de si sabemos exactamente cuando cambia.

he cambiado para que compruebe lo hace UBound(a) justo antes del comienzo y después de sólo cada vez que el ReDim se llama

En mi computadora el viejo método tomó 7,52 segundos para una IMAX de 10 millones de personas.

El nuevo método tomó 5.29 segundos para un imax de 10 millones, lo que significa un aumento del rendimiento de más del 20% (para 10 millones de intentos, obviamente este porcentaje tiene una relación directa con el número de intentos)

0

esto un poco tarde pero de todos modos también es algo difícil

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' 

revisión y dime si esto puede funcionar inicialmente o de guardar todos los datos en cadena y posteriormente dividida para gama

0

No es una respuesta o por qué 'tricky 'Es malo:

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

Por su facilidad de copiar y pegar

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

usado como así

a = Array() 
a = AddItem(a, 5) 
a = AddItem(a, "foo") 
Cuestiones relacionadas