Compañeros, tengo un array dinámico de TPoint, necesito eliminar los items duplicados y redimensionar el array. Recibo ideas.
Muchas gracias
Saludos

Eliminar items duplicados en array dinámico
Started by
Wilson
, Aug 24 2010 06:21 PM
4 replies to this topic
#1
Posted 24 August 2010 - 06:21 PM
#2
Posted 24 August 2010 - 06:53 PM
Compañeros, tengo un array dinámico de TPoint, necesito eliminar los items duplicados y redimensionar el array. Recibo ideas.
Muchas gracias
Saludos
Hola amigo, no he trabajado con un arreglo de TPoint, pero ¿ no sería más fácil crear un array secundario y "pasar" con un loop los valores que no están repetidos ?
Si pudieras colocar las dimensiones y los valores de tu Arreglo, sería de mucha utilidad para poder darte una respuesta más acertada.
Salud OS
#3
Posted 24 August 2010 - 07:03 PM
Gracias por contestar Egostar.
Esta solución ya la intenté y me funciona, pero no estoy a gusto con el código, pensé que algún compañero depronto tuviera algo resuelto o alguna idea independientemente del tipo de array.
Gracias.
Hola amigo, no he trabajado con un arreglo de TPoint, pero ¿ no sería más fácil crear un array secundario y "pasar" con un loop los valores que no están repetidos ?
Esta solución ya la intenté y me funciona, pero no estoy a gusto con el código, pensé que algún compañero depronto tuviera algo resuelto o alguna idea independientemente del tipo de array.
Gracias.
#4
Posted 24 August 2010 - 07:28 PM
Hola Wilson,
Lamentablemente, creo, que no hay otro método que el recorrer el array elemento a elemento y sobreescribir los valores duplicados por otros. Luego volver a redimensionar, y para ello deberá llevarse la cuenta de repetidos encontrados.
El algoritmo se puede volver un poco mas fácil si los datos están ordenados ya que no requiere de un doble bucle. En este escenarios todos los repetidos a un elemento están en posiciones contínuas. La idea es similar al anterior enfoque:
Se evalúa posición a posición y se sobreescribe el valor siguiente al evaluado en cuanto se deje de evaluar repetidos.
Lo explico:
1. Tomemos la posición i-ésima y la siguiente i-ésima + 1. Si resulta ser que ambos son iguales, se incrementa la cantidad de repetidos. Guardamos este i+1 en una variable temporal. Seguimos evaluando, i+2, i+3... así hasta que en algún i+m ya no se detecte un valor idéntico, en estos nuevos repetidos no pisamos el valor temporal... sólo buscamos quedarnos con la 1ra aparición. Entonces podemos llegar a la conclusión de que en i+m está el siguiente número diferente. Entonces en la posición i+1 (el primer repetido de su serie) guardamos este nuevo valor (el que está en i+m). Continuamos el procedimiento desde este punto.
Al final tendremos los valores diferentes en forma ordenada y contigua y sabremos la cantidad total de repetidos. Nos resta ahora redimensionar.
Espero que se entienda la idea.
Ahora el problema es que en tu caso el arreglo es de tipo TPoint. Y éste es un record de dos campos. Requiere de mayor control ¿Cuando se considera repetido? Cuando la dupla (X,Y) es igual a otra (X,Y)? ¿O se considera a cada campo por separado?
Saludos,
Lamentablemente, creo, que no hay otro método que el recorrer el array elemento a elemento y sobreescribir los valores duplicados por otros. Luego volver a redimensionar, y para ello deberá llevarse la cuenta de repetidos encontrados.
El algoritmo se puede volver un poco mas fácil si los datos están ordenados ya que no requiere de un doble bucle. En este escenarios todos los repetidos a un elemento están en posiciones contínuas. La idea es similar al anterior enfoque:
Se evalúa posición a posición y se sobreescribe el valor siguiente al evaluado en cuanto se deje de evaluar repetidos.
Lo explico:
1. Tomemos la posición i-ésima y la siguiente i-ésima + 1. Si resulta ser que ambos son iguales, se incrementa la cantidad de repetidos. Guardamos este i+1 en una variable temporal. Seguimos evaluando, i+2, i+3... así hasta que en algún i+m ya no se detecte un valor idéntico, en estos nuevos repetidos no pisamos el valor temporal... sólo buscamos quedarnos con la 1ra aparición. Entonces podemos llegar a la conclusión de que en i+m está el siguiente número diferente. Entonces en la posición i+1 (el primer repetido de su serie) guardamos este nuevo valor (el que está en i+m). Continuamos el procedimiento desde este punto.
Al final tendremos los valores diferentes en forma ordenada y contigua y sabremos la cantidad total de repetidos. Nos resta ahora redimensionar.
Espero que se entienda la idea.
Ahora el problema es que en tu caso el arreglo es de tipo TPoint. Y éste es un record de dos campos. Requiere de mayor control ¿Cuando se considera repetido? Cuando la dupla (X,Y) es igual a otra (X,Y)? ¿O se considera a cada campo por separado?
Saludos,
#5
Posted 26 August 2010 - 07:30 PM
Gracias Delphius por tu respuesta.
Saludos
Saludos