arrays - multidimensional - ubound vbscript
Agregar elemento a la matriz en VBScript (7)
Basado en la respuesta de Charles Clayton , pero un poco simplificado ...
'' add item to array
Sub ArrayAdd(arr, val)
ReDim Preserve arr(UBound(arr) + 1)
arr(UBound(arr)) = val
End Sub
Utilizado como tal
a = Array()
AddItem(a, 5)
AddItem(a, "foo")
¿Cómo agregar un elemento a una matriz existente en VBScript?
¿Hay un VBScript equivalente a la función de inserción en Javascript?
es decir
myArray tiene tres elementos, "Manzanas", "Naranjas" y "Bananas" y quiero agregar "Sandías" al final de la matriz.
Hay varias formas, sin incluir un objeto COM o ActiveX personalizado
- Reserva ReDim
- Objeto de diccionario, que puede tener claves de cadena y buscarlas
- ArrayList .Net Framework Class, que tiene muchos métodos que incluyen: ordenar (reenviar, revertir, personalizar), insertar, eliminar, binarysearch, igual, toArray y toString
Con el siguiente código, encontré que Redim Preserve es el más rápido por debajo de 54000, el Diccionario es el más rápido de 54000 a 690000, y el Array List es el más rápido por encima de 690000. Tiendo a usar ArrayList para empujar debido a la clasificación y la conversión de array.
user326639 proporcionó FastArray, que es prácticamente el más rápido.
Los diccionarios son útiles para buscar el valor y devolver el índice (es decir, los nombres de campo), o para agrupar y agregar (histogramas, agrupar y agregar, agrupar y concatenar cadenas, agrupar y empujar subarreglas). Al agrupar en teclas, configure el Modo de comparación para el caso en / sensibilidad y verifique la propiedad "existe" antes de "agregar" -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]
Las matrices no son muy dinámicas en VBScript. Tendrá que usar la declaración ReDim Preserve para hacer crecer la matriz existente para que pueda acomodar un elemento adicional:
ReDim Preserve yourArray(UBound(yourArray) + 1)
yourArray(UBound(yourArray)) = "Watermelons"
Ligero cambio al 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 tiene sentido marcar UBound(a)
en todos los ciclos del, si sabemos exactamente cuándo cambia.
Lo he cambiado para que compruebe si hace UBound(a)
justo antes de que comience, y solo cada vez que se llama a ReDim
En mi computadora, el viejo método tomó 7.52 segundos para un imax de 10 millones.
El nuevo método tomó 5.29 segundos para un imax de 10 millones, lo que significa un aumento en el 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)
Para 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
Utilizado como tal
a = Array()
a = AddItem(a, 5)
a = AddItem(a, "foo")
esto es un poco tarde pero de todos modos y también es algo complicado
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''
revíselo y dígame si esto puede funcionar o si inicialmente guarda todos los datos en una cadena y luego se dividirá para la matriz
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