Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda para hacer un algoritmo de busqueda y comparacion (https://www.clubdelphi.com/foros/showthread.php?t=62373)

JoAnCa 18-12-2008 20:51:58

Ayuda para hacer un algoritmo de busqueda y comparacion
 
Hola a todos
Necesito ayuda para elaborar un algoritmo que me permita buscar un elemento de una lista en otra lista.

Es decir

Lista 1 ---- Lista 2
1 ------------ a
2 ------------ b
3 ------------ c

Comparar 1 con cada elemento a, b y c para saber si son iguales
Comparar 2 y 3 de la misma forma

Para explicarme mejor:

Tengo una BD con todos los Discos duros de la PC, y hago un nuevo chequeo de hardware donde obtengo la lista de discos duros existentes en ese momento en la PC
El objetivo es comparar si son los mismos que estan en la BD o si hubo cambios con alguno de ellos (es decir, si cambiaron uno por otro, o quitaron, o agregaron alguno).
El cambio lo detecto por el numero de serie que es unico para cada disco duro

Tal vez el metodo que trato de implementar no sea el correcto, pero agradeceria cualquier ayuda para poder hacer lo que quiero

Rockin 18-12-2008 22:26:56

pues dependiendo el componente que uses, se me ocurre algo asi:
Código Delphi [-]
for i:= 1 to num_elementos_lista1 do
begin
    
      for j:= 1 to num_elementos_lista2 do
      begin
             
              IF elemento_lista1[i] = elemento_lista2[j] then
              begin
                    //hacemos lo que queramos si son iguales los elementos
              end;

      end;
end;

Es una idea, no se como es la lista, si es una tabla, un Tlist, o lo que sea.

Saludos

JoAnCa 19-12-2008 22:10:39

Hola Rockin

Vale la idea que me das, las listas una es una tabla y la otra un stringlist, ya habia probado algo parecido pero el problema esta en que cuando comparo, siempre me da diferente.
Pues me compara el Elemento 1 con cada uno de la otra lista, y entonces cuando compara con el 1 da Verdadero y con los siguientes me da falso
Y al final no se como hacer para saber si el disco 1 cambio




Gracias

Lepe 20-12-2008 00:16:59

la tabla, cárgalo en otro stringlist si quieres:
Código Delphi [-]
// lista1 la base de datos
// lista2 el stringlist con los discos duros
for i:= 0 lista1.count-1 do
begin
   if lista2.indexOf(lista1[i]) = -1 then
      showmessage('ups no existe ' + lista1[i] + ' en lista2');
end;

Saludos

JoAnCa 20-12-2008 16:26:00

Muy bueno tu codigo Lepe, de esa forma es mas facil saber si un elemento de una lista existe en la otra.

Entonces aplicando esa funcion, lo que pretendo hacer es:
- Buscar cada elemento de Lista1 en Lista2
- Lo almaceno en X si no existe
- Buscar cada elemento de Lista2 en Lista1
- Lo almaceno en Y si no existe
- Si X o Y contienen algo, entonces emito el mensaje de que hubo cambios y muestro los valores de X y de Y

Este algoritmo estara correcto asi? :rolleyes:
Si tienen otra forma mejor o mas optima, digamenlo tambien para implementarlo, o si con este algoritmo ya estaria bien.

Lepe 20-12-2008 21:53:04

Puedes usar otra lista ¿no?
Código Delphi [-]
// lista1 la base de datos
// lista2 el stringlist con los discos duros
noExiste = TStringlist.Create;
for i:= 0 lista1.count-1 do
begin
   if lista2.indexOf(lista1[i]) = -1 then
      noExiste.Add(Lista1[i])
end;
if noExiste.Count > 0 then
   ShowMessage(' Se han eliminado los siguientes discos ' + #13#10 + noExiste.CommaText);

Cuando te mostrará los discos duros que han sido reemplazados.

Saludos

JoAnCa 23-12-2008 20:50:48

El objetivo es cuando se va a revisar la PC (auditoria), al hacer clic en un boton obtiene los datos del hardware y los compara con los que estan previamente almacenados en la BD. Si hay cambios los muestra en un Treeview clasificados por categorias

fjcg02 23-12-2008 22:55:28

Algoritmo para comparar dos listas de valores
Las listas pueden ser en tablas, listas, cualquier cosa, lo unico que hay que hacer es adecuar el código al caso que proceda.A saber, si es una lista aumentar en uno el contador y si es una tabla leer el siguiente registro.

Importante: Las listas deben estar ordenadas por el mismo valor, que es el que se compara

Código Delphi [-]
1.- Poner las listas en su primer elemento
2.- Comparar los elementos
    A.- Son iguales ? El valor leido está en las dos listas
                           Actuar en consecuencia.
                           Coger los siguientes valores de las dos listas.

    B.- el valor de la lista 1 es menor? El valor de la lista 1 sólo se encuentra en la primera lista.
                                                  Actuar en consecuencia.
                                                  coger el elemento siguiente de la primera lista
    C.- el valor de la lista 2 es menor? El valor de la lista 2 sólo se encuentra en la segunda lista.
                                                  Actuar en consecuencia.
                                                  coger el elemento siguiente de la segunda lista
    D.- Si no se han acabado las listas, Volver a iterar el punto 2
    E.- Si se ha acabado alguna de las listas ,iterar leyendo siempre de la que no ha acabado. Se actúa como si la que no ha acabado es menor el valor.
3.- Ya está

Este procedimiento asegura un par de cosas.
1.- Se tratan todos los elementos.
2.- Se optimiza al máximo los accesos, ya que sólo se lee una vez cada elemento de las listas.

Este procedimiento seguro que lo conocen aquellos que han trabajado con ficheros secuenciales, es decir, los mayores de 38/40 años, ya que se utilizaba a menudo en programas cobol con ficheros secuenciales. Yo los hacía con lápiz y papel, que en definitiva, es como mejor se aprende.De primero de informática de los años 70-80.
CONCLUSIÓN: Si los elementos son iguales, se lee de las dos listas. Si son distintos, siempre se lee de la lista del elemento menor.

Un pequeño juego de ensayo quizás ayude a comprenderlo

Código SQL [-]
Lista1      Lista2
1            1      
2            3
4            5
5            6
6
Iteraciones
1 - 1 -> Iguales se leen las dos listas
2 - 3 -> menor el de la lista 1, el 2 no está en la lista 2, se lee de la lista 1.
4 - 3 -> menor el de la lista 2, el 3 no está en la lista 1. leo de la lista 2
4 - 5 -> menor el de la lista 1, el 4 no está en la lista 2, leo de la lista 1
5 - 5 -> iguales, el 5 está en las dos listas, se lee de las dos listas
6 - 6 -> iguales, el 6 está en las dos listas, se lee de las dos listas
FIN

Espero que os sea de ayuda

Un saludo


La franja horaria es GMT +2. Ahora son las 08:27:48.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi