delphi duplicates virtualtreeview

Delphi VirtualStringTree-¿Buscar duplicados?



duplicates virtualtreeview (3)

Sí, sé que publico muchas preguntas, pero eso se debe a que o bien necesito estar seguro de que estoy haciendo lo correcto, de lo que estoy haciendo mal, o si no tengo ni idea, y no puedo encontrar nada en la documentación. De todos modos,

Estoy tratando de verificar si hay nodos duplicados. Así es como me gustaría hacerlo:

Pasa a través de mis nodos y compara el texto de cada nodo (registro), pero si obtuve muchos nodos, ¿no sería demasiado tiempo y consumo de memoria? ¿Habría un mejor enfoque para esto?

¡Gracias! - Jeff.

EDITAR: Gracias a Deltics, ¡lo conseguí trabajando! En caso de que tengamos algunas personas con la misma pregunta, aquí hay un código de trabajo, usando 2 niveles de nodos en VST.

Procedure UncheckDuplicates; Var ParentNode,ChildNode : PVirtualNode; I,J : Integer; SL : TStringList; SkypeID : String; Begin SL := TStringlist.Create; try ParentNode := frmMain.vtSkype.GetFirst; for I := 0 to frmMain.vtSkype.RootNodeCount - 1 do begin ChildNode := ParentNode.FirstChild; for J := 0 to ParentNode.ChildCount - 1 do begin if NodeIsChecked(ChildNode) then begin SkypeID := GetData(ChildNode).SkypeID; if SL.IndexOf(SkypeID) <> -1 then begin ChildNode.CheckState := csUncheckedNormal; end else begin SL.Add(SkypeID); end; end; ChildNode := ChildNode.NextSibling; end; ParentNode := ParentNode.NextSibling; end; finally SL.Free; end; frmMain.vtSkype.Refresh; End;

No tengo miedo de compartir mi código, se lo debo a la comunidad. :)


Depende del punto en el que esté buscando duplicados.

Si se encuentra en el punto en el que está agregando elementos y está agregando todos los elementos al mismo tiempo (o si es posible / apropiado moverlo, haga clic en duplicado para ver en qué árbol está poblado, en lugar de trabajar con un árbol ya poblado) y mantener una lista de elementos ya agregados sobre la marcha podría ser la forma más sencilla, por ejemplo, suponiendo que está agregando elementos de una lista de cadenas simple (en cadenas en este código de ilustración):

alreadyAdded := TStringList.Create; try alreadyAdded.Sorted := TRUE; // Sorting ensures an efficient binary lookup for IndexOf()... for i := 0 to Pred(strings.count) do begin if alreadyAdded.IndexOf(strings[i]) <> -1 then CONTINUE; AddNode(strings[i]); alreadyAdded.Add(strings[i]); end; finally alreadyAdded.Free; end;


La versión de David funcionará. Si tiene D2010 o posterior, también puede usar una colección de conjuntos de DeHL, que usa un hash para verificar si hay duplicados y puede procesar su lista en el tiempo O (n).


Normalmente reunirías todas tus cadenas en una lista y luego las ordenarías. Luego puede recorrer y verificar los elementos adyacentes para ver la igualdad.

Eso es O (n log n) suponiendo un algoritmo de ordenamiento razonable en oposición al algoritmo ingenuo que es O (n ^ 2). Si no tienes muchos artículos, entonces los ingenuos funcionarán perfectamente bien.