ubound multidimensional asp array arrays vbscript

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

  1. Reserva ReDim
  2. Objeto de diccionario, que puede tener claves de cadena y buscarlas
  3. 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