Foros del Web » Programando para Internet » ASP Clásico »

Problema al unir dos arreglos...

Estas en el tema de Problema al unir dos arreglos... en el foro de ASP Clásico en Foros del Web. Hola a todos: Tengo este problema a la hora de eliminar los elementos repetidos de un arreglo mediante esta funcion... Código HTML: <% Arreglo2=Array(1,9,4,7,2,6,3,5,8) Arreglo3=Array(9,4) ...
  #1 (permalink)  
Antiguo 12/08/2008, 16:03
Avatar de ciisteado  
Fecha de Ingreso: enero-2008
Ubicación: Home Office
Mensajes: 111
Antigüedad: 16 años, 4 meses
Puntos: 0
Exclamación Problema al unir dos arreglos...

Hola a todos:

Tengo este problema a la hora de eliminar los elementos repetidos de un arreglo mediante esta funcion...
Código HTML:
<%
	Arreglo2=Array(1,9,4,7,2,6,3,5,8)
	Arreglo3=Array(9,4)

	'Lleno el "Arreglox" con los datos de "Arreglo2" y "Arreglo3"
	For h=LBound(Arreglo2) to UBound(Arreglo2)
		redim preserve Arreglox(v)
		Arreglox(v)=Arreglo2(h)
		v=v+1
		for p=LBound(Arreglo3) to UBound(Arreglo3)
			redim preserve Arreglox(f)
			Arreglox(f)=Arreglo3(p)
			f=f+1
		next
	next
	'A los datos de "Arreglox" les elimino los espacios en blanco que encuentre
	for g=LBound(Arreglox) to UBound(Arreglox)
		clavedocs=Arreglox(g)
		clavedoc=Trim(clavedocs)
		redim preserve Arreglo(gg)	'Una ves que he quitado los espacios en blanco, cada dato lo asigno a "Arreglo"
		Arreglo(gg)=clavedoc
		gg=gg+1
	next
	
	For i = LBound(Arreglo) To UBound(Arreglo)   
		ReDim Preserve TempArray(i)   'Redimensionamos el Arreglo temporal y preservamos el valor   
		TempArray(i) = Arreglo(i)   'Asignamos al array temporal el valor del otro arreglo
	Next
	'Verifica si hay elementos repetidos
	For x=0 To UBound(Arreglo)   
        z=0   
        For y=0 To UBound(Arreglo)   
            If Arreglo(x) = TempArray(z) And y <> x Then   'Si el elemento del arreglo es igual al arreglo temporal
                Arreglo(y) = "" 'Entonces Eliminamos el valor duplicado
				Arreglo(x) = ""   
            End If   
            z=z+1   
        Next    
    Next 
	
	'Recorremos el array resultante
    For Each Elemento In Arreglo   
        If Elemento <> "" Then 'Si el elemento es distinto de una cadena vacia, sea asigna el valor a "docs1"
			redim preserve docs1(b)
			docs1(b)=Elemento
			b=b+1
		end if
    Next

%>
Haciendo esta función el resultado correcto que debería mostrar sería:

Arreglo 2: 1,9,4,7,2,6,3,5,8

Arreglo 3: 9,4

Arreglo: 9,4,1,9,4,7,2,6,3,5,8 (la union de los dos arreglos anteriores)

Arreglo Final: 1,7,2,6,3,5,8 (solo los elementos que NO se repiten)

Pero por alguna razón el resultado me lo muestra asi:
B]Arreglo 2:[/B] 1,9,4,7,2,6,3,5,8

Arreglo 3: 9,4

Arreglo: 1,4,1,9,4,7,2,6,3,5,8

Arreglo Final: 9,7,2,6,3,5,8

El problema esta en que a la hora de unir los dos arreglos, siempre toma Arreglo 3[0]=1 y no el valor 9 como en este ejemplo deberia tomar... creo que el detalle esta a la hora de unir los dos arreglos por que la eliminacion de los elementos repetidos la realiza bien... ¿¿No sé si me expliqué...??

Cabe mencionar que los elementos de Arreglo 3 deben ser forsozamente alguno(s) de los elementos del Arreglo 2...

Asi pues, espero entiendan el problema que se me presenta y de ser asi ayudarme a resolverlo... agradeceré cualquier idea y ayuda...

Saludos y gracias a todos....
  #2 (permalink)  
Antiguo 12/08/2008, 19:21
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 17 años, 3 meses
Puntos: 88
Respuesta: Problema al unir dos arreglos...

esta es una de esas ocasiones en las cuales, la "paciencia" para depurar es una bendicion

como puedes identificar el problema?? anteponiendo en cada entrada de los FOR un "response.write" por cada elemento de los arreglos, esto con el fin de entender que datos esta manipulando en ese momento

en si... cual es el proposito de utilizar 3 arreglos extras (arreglo,arreglox,temparray)?
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #3 (permalink)  
Antiguo 12/08/2008, 22:16
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Respuesta: Problema al unir dos arreglos...

Divide y vencerás, ya lo dijo el caballero del zodiaco, realmente trata de optimizar ese código ya que el mantenimiento te dará varios dolores de cabeza, más que ayudarte a enredar más esa maraña, si elaboras en el problema, de repente te podemos ayudar a simplificar la solución.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #4 (permalink)  
Antiguo 13/08/2008, 10:52
Avatar de ciisteado  
Fecha de Ingreso: enero-2008
Ubicación: Home Office
Mensajes: 111
Antigüedad: 16 años, 4 meses
Puntos: 0
De acuerdo Respuesta: Problema al unir dos arreglos...

Hola:

Bueno pues, por algo son los Master's del ASP... Shiryu_Libra, u_goldman gracias por sus recomendaciones y si, he resuelto el problema simplificando en mucho el código original, despues de un rato de "Paciencia extrema" llegue a lo siguiente:

Código HTML:
<%
	Dim Arreglo1
	Dim Arreglo2
	Dim Arreglo3(),TempArray()
        Dim Elemento
	Dim i,j,k,l,m,n,p,q
		
	Arreglo1=Array(9,4,8)
	Arreglo2=Array(1,9,4,7,2,6,3,5,8)

	inicio=UBound(Arreglo2)+1 'Extrae el índice mayor de "Arreglo2()" que en el ejemplo sería 8, se le aumenta 1 a ese índice para indicar en donde van a iniciar el siguiente elemento, el índice seria 9
	fin=UBound(Arreglo1)+inicio 'Extrae el índice mayor de "Arreglo1()" que en ejemplo sería 2, se le aumentan el valor de "inicio" para delimitar el nuevo índice mayor de "Arreglo2()"
	
	i=0 ' Llenamos "Arreglo2" con los valores que tenia inicialmente más los valores de "Arreglo1()", para ello ocupamos los valores de "inicio" y "fin"
	for j= inicio to fin
		redim preserve Arreglo2(fin) '"Arreglo2()" crecerá hasta el valor de "fin"(11, para este ejemplo) conservando los valores que tenia previamente asignados
		Arreglo2(j)=Arreglo1(i) 'Cada elemento de "Arreglo1()" lo metemos en "Arreglo2()"
		i=i+1
	next
	
	for j=LBound(Arreglo2) to UBound(Arreglo2) 'Recorremos de principio a fin a "Arreglo2()"
		redim preserve TempArray(j) ' Asigna los valores de "Arreglo2()" a "TempArray()" que servirá para comparar que elementos NO se repiten
		TempArray(j)=Arreglo2(j)
	next
	
	for k=0 to UBound(Arreglo2)	'Recorremos de principio a fin a "Arreglo2()"
		m=0
		for l=0 to UBound(Arreglo2)	'Recorremos de principio a fin a "Arreglo2()"
			if Arreglo2(k)=TempArray(m) and l<>k then	'Verifica si el elemento de "Arreglo2()" es igual al elemento de "TempArray()" y ademas estan en distinta posición
				Arreglo2(l)="" 	'Elimina ambos valores de "Arreglo2()"
				Arreglo2(k)=""
			end if
			m=m+1
		next
	next
	
	p=0
	For Each Elemento In Arreglo2  ' Por cada elemento de "Arreglo2()" verifica...
        If Elemento <> "" Then 	'Si el elemento contiene datos lo asigna a "Arreglo3()"
			redim preserve Arreglo3(p)
			Arreglo3(p)=Elemento
			p=p+1
		end if
    Next
%>
El problema que tenia en el anterior código era a la hora de llenar el "Arreglo3" con los datos de "Arreglo1" y "Arreglo2" cosa innecesaria, pues basto acomodar los valores del For y solo meter los datos de "Arreglo1" en "Arreglo2" conservando los elementos que previamente tenia "Arreglo2", la parte importante es esta(creo yo ):

inicio=UBound(Arreglo2)+1
fin=UBound(Arreglo1)+inicio

i=0
for j= inicio to fin
redim preserve Arreglo2(fin)
Arreglo2(j)=Arreglo1(i)
i=i+1
next

Por lo demas la lógica es practicamente la misma, cualquier duda bastará con leer el código y tratar de entenderlo, sino es suficiente, postear su inquietud aqui mismo sera lo mejor....

Asi pues, dejo la solución a consideración de los Moderadores y para cualquiera que tenga un problema de iguales similitudes(esto es lo bueno de los foros )

Saludos y una ves mas gracias a los que colaboraron: Shiryu_Libra y u_goldman
  #5 (permalink)  
Antiguo 13/08/2008, 12:43
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Respuesta: Problema al unir dos arreglos...

Bueno, ya está solucionado, pero te paso una solución alternativa que comencé anoche y recién termino :P

Código:
<%
CONST adInteger = 3
CONST adOpenDynamic = 2
CONST adUseClient = 3

Arreglo1=Array(9,4,8)
Arreglo2=Array(1,9,4,7,2,6,3,5,8)

Set rs = Server.CreateObject("ADODB.Recordset")
With rs
	.CursorLocation = adUseClient
	.CursorType = adOpenDynamic
	.Fields.Append "elemento", adInteger, 255, &H00000020
	.open

	for i = 0 to UBound(Arreglo2)
		.AddNew
		.Fields("elemento") = Arreglo2(i)
		.update
	next

		tmp = ""
		For j = 0 to UBound(Arreglo1)
			tmp = tmp & " elemento <> " & Arreglo1(j) & " AND "
		Next
		tmp = Left(tmp, len(tmp) - 5)

		.Filter = tmp
		.MoveFirst

		do while not .eof
			response.write rs("elemento") & "<br />"
		.Movenext
		loop
		.close
End With
Set rs = nothing
%>
Un saludo
__________________
...___...
  #6 (permalink)  
Antiguo 13/08/2008, 14:44
Avatar de ciisteado  
Fecha de Ingreso: enero-2008
Ubicación: Home Office
Mensajes: 111
Antigüedad: 16 años, 4 meses
Puntos: 0
De acuerdo Respuesta: Problema al unir dos arreglos...

Hey Al Zuwaga:

Para concluir el tema solo faltaba la aportación de usted y vaya que se inspiro... aunque me cuesta entender su código lo he probado y funciona al 100%, que bueno que se haya tomado el tiempo de desarrollarlo...

Ahora solo le pediria(de ser posible) si pudiera explicar su código, como ya se habrá dado cuenta soy un poquito más que novato en esto y no entiendo al 100% su código ...

Ahora bien para todos los novatos como yo, aqui hay una solución más a este problema...

Gracias por su aporte Maestro Al Zuwaga

Saludos...
  #7 (permalink)  
Antiguo 13/08/2008, 14:51
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 17 años, 3 meses
Puntos: 88
Respuesta: Problema al unir dos arreglos...

todo codigo puede mejorarse, no es asi ciisteado?

si te fijas al principio del codigo, utiliza un recordset

recordset -> tabla -> consultas -> update?

ya te esta sonando lo que realiza?

imagina que es una base de datos, y buscas un valor para actualizarlo



se pasa el profe verdad?
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #8 (permalink)  
Antiguo 13/08/2008, 16:24
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Respuesta: Problema al unir dos arreglos...

Es bastante simple

- Genero un recordset a partir de los valores del Arreglo2 (.AddNew, .Update)
- A partir del Arreglo1 genero una variable (tmp) que contiene "el filtro"
- Uso ese filtro en la propiedad (o método ) .Filter del objeto recordset

Sería como tener una tabla dentro de una bd con el campo "elemento". Este campo contendrá los registros (los elementos de Arreglo2).
Luego, se hace un query que quedaría mas o menos así:

SQL = "SELECT elemento FROM tabla_inexistente WHERE elemento <> 9 AND elemento <> 4 AND elemento <> 8"
__________________
...___...
  #9 (permalink)  
Antiguo 13/08/2008, 16:29
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Respuesta: Problema al unir dos arreglos...

Bien...

¿podrias ahorrar la iteración para construir el filtro? (Nunca usé filter para un recordset)

Código:
<%
CONST adInteger = 3
CONST adOpenDynamic = 2
CONST adUseClient = 3

Arreglo1=Array(9,4,8)
Arreglo2=Array(1,9,4,7,2,6,3,5,8)

Set rs = Server.CreateObject("ADODB.Recordset")
With rs
	.CursorLocation = adUseClient
	.CursorType = adOpenDynamic
	.Fields.Append "elemento", adInteger, 255, &H00000020
	.open

	for i = 0 to UBound(Arreglo2)
		.AddNew
		.Fields("elemento") = Arreglo2(i)
		.update
	next

		'tmp = ""
		'For j = 0 to UBound(Arreglo1)
		'	tmp = tmp & " elemento <> " & Arreglo1(j) & " AND "
		'Next
		'tmp = Left(tmp, len(tmp) - 5)

                tmp = "NOT IN("&Join(Arreglo1, ",")&")"

		.Filter = tmp
		.MoveFirst

		do while not .eof
			response.write rs("elemento") & "<br />"
		.Movenext
		loop
		.close
End With
Set rs = nothing
%>
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway

Última edición por u_goldman; 13/08/2008 a las 16:34
  #10 (permalink)  
Antiguo 13/08/2008, 16:32
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 17 años, 3 meses
Puntos: 88
Respuesta: Problema al unir dos arreglos...

retomo parte del anterior mensaje
Cita:
Iniciado por Shiryu_Libra Ver Mensaje
todo codigo puede mejorarse, no es asi ciisteado?
ahora solo falta que llegue Sensei Myakire, a quitar o agregarle algo al codiguillo
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #11 (permalink)  
Antiguo 13/08/2008, 17:04
Avatar de ciisteado  
Fecha de Ingreso: enero-2008
Ubicación: Home Office
Mensajes: 111
Antigüedad: 16 años, 4 meses
Puntos: 0
De acuerdo Respuesta: Problema al unir dos arreglos...

Hola:

Pues un verdadero placer que todos los Master's esten participando en este tema... y bueno, probe la variante de u_goldman y marca el siguiente error:
Cita:
Tipo de error:
ADODB.Recordset (0x800A0BB9)
Argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros.
/xxxxxx/prueba5.asp, línea 30
La linea 30 es: .Filter = tmp , ya probe tambien quitando esta linea pero solo me muestra todo el Arreglo2...no sé que falta o que sobra

Y bueno, en base a la solución de Al Zuwaga me atrevi a comentar su código, aqui lo pongo a continuación:

Código HTML:
<%
	CONST adInteger = 3	'Define los valores para las variables que utilizará el recordset para manipular los datos
	CONST adOpenDynamic = 2
	CONST adUseClient = 3
	CONST adFldIsNullable = &H00000020

	Arreglo1=Array(9,4,8)
	Arreglo2=Array(1,9,4,7,2,6,3,5,8)
	
	Set rs = Server.CreateObject("ADODB.Recordset")
	With rs
		.CursorLocation = adUseClient	'Define tipos de cursor que utilizará el recordset
		.CursorType = adOpenDynamic	'El "rs" se recorrera en cualquier sentido, posibilitando ver cualquier insert,update o delete de datos en "rs"
		.Fields.Append "elemento", adInteger, 255, adFldIsNullable 'El formato que tendrán los datos que aceptará el recordset
		.open
		
		for i = 0 to UBound(Arreglo2) 'Recorre el Arreglo2 e inserta los datos en el recordset
			.AddNew
			.Fields("elemento") = Arreglo2(i)
			.update
		next
	
		tmp = ""
		For j = 0 to UBound(Arreglo1) 'Recorre el Arreglo 1
			tmp = tmp & " elemento <> " & Arreglo1(j) & " AND " 'Arma la validación en base a los elementos del Arreglo1
		Next

		tmp = Left(tmp, len(tmp) - 5) 'Esto es simplemente para quitar el ultimo "AND" de la validación anterior
		.Filter = tmp 'Filtra los datos del recordset de acuerdo a la validación anterior, para este ejemplo quedaría: "elemento <> 9 AND elemento <> 4 AND elemento <> 8"  elemento es cada uno de los valores de Arreglo2
		.MoveFirst
		do while not .eof ' Y por ultimo imprime los elementos que hayan superado el filtro
			response.write rs("elemento") & "<br>"
		.Movenext
		loop
		.close
	End With
	Set rs = nothing
%> 
Ahora solo espero no estar tan lejos de la realidad en cuanto a los comentarios que puse y que esto sirva para los novatos como yo...

Por hoy no me resta mas que agradecer y agradecer a todos los que participaron en este tema...vaya que puede mejorarse cualquier código...

Gracias Maestros... mis respetos

Saludos a todos....
  #12 (permalink)  
Antiguo 13/08/2008, 17:18
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Respuesta: Problema al unir dos arreglos...

Ya lo probe...

Al filter no le gustaron las sentencias NOT IN ademas que le faltaba especificar el campo, pero dandole un poquito la vuelta:

Código:
<%
CONST adInteger = 3
CONST adOpenDynamic = 2
CONST adUseClient = 3

Arreglo1=Array(9,4,8)
Arreglo2=Array(1,9,4,7,2,6,3,5,8)

Set rs = Server.CreateObject("ADODB.Recordset")
With rs
	.CursorLocation = adUseClient
	.CursorType = adOpenDynamic
	.Fields.Append "elemento", adInteger, 255, &H00000020
	.open

	for i = 0 to UBound(Arreglo2)
		.AddNew
		.Fields("elemento") = Arreglo2(i)
		.update
	next

         tmp = " elemento <> " & Join(Arreglo1, " AND elemento <> ")

		.Filter = tmp
		.MoveFirst

		do while not .eof
			response.write rs("elemento") & "<br />"
		.Movenext
		loop
		.close
End With
Set rs = nothing
%>
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #13 (permalink)  
Antiguo 14/08/2008, 11:34
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Respuesta: Problema al unir dos arreglos...

Cita:
Al filter no le gustaron las sentencias NOT IN
Efectivamente, lo intenté con NOT IN pero no hubo caso. Igual lo intenté primeramente con literales (tmp = "NOT IN(9,4,8)) para evitar la segunda iteración... no se me había ocurrido el Join()!!!

ciisteado, los comentarios están muy bien . El código te quedó clarísimo y eso es bueno
__________________
...___...
  #14 (permalink)  
Antiguo 14/08/2008, 11:53
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Respuesta: Problema al unir dos arreglos...

Cita:
Iniciado por Al Zuwaga Ver Mensaje
Efno se me había ocurrido el Join()!!!
A mi tampoco, sólo fué para ponerme molestón, es curioso como resolvemos las cosas, a mi nunca se me hubiera ocurrido crear un recordset desconectado y filtrarlo

Ahí queda de testimonio que todo se puede hacer con el recordset
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #15 (permalink)  
Antiguo 14/08/2008, 13:51
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Respuesta: Problema al unir dos arreglos...

La verdad que se me ocurrió usar la opción del recordset desconectado (me gusta más ese término... yo lo llamaba volátil ) porque el manejo de arrays de VBScript me resulta lamentable. Justamente este es uno de los puntos en donde mi balanza se inclina por PHP sobre ASP.
__________________
...___...
  #16 (permalink)  
Antiguo 08/01/2009, 18:20
 
Fecha de Ingreso: noviembre-2008
Mensajes: 3
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Problema al unir dos arreglos...

Hey! estaba buscando algo como esto, los arreglos en asp me tenian loco, se me habia ocurrido usar un recordset pero no sabia como sin llenarlo con una consulta sql.
Muchas gracias por darse el trabajo!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:39.