FTP | CCD | Buscar | Trucos | Trabajo | Foros |
#1
|
|||
|
|||
Hashtable
Hola a todos:
¿ Existe en Delphi alguna clase que implemente lo que en Java se conoce como Hashtable ? Deseo guardar objetos (o números) de acuerdo a alguna clave.... Gracias. Roy |
#2
|
||||
|
||||
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#3
|
|||
|
|||
... simple y claro. Muchas gracias.
Roy |
#4
|
||||
|
||||
Hola,
Aunque la clase parece un poco menos potente que la que te propone delphi.com.ar, Delphi (al menos la versión 6 Enterprise) trae una clase llamada THashedStringList en la unit IniFiles. Quizás te sirva y de este modo evitas depender de una unidad externa. Saludos. |
#5
|
||||
|
||||
Hola,
¿Y por qué no qudarse con nuestra querida TStrings? Cualquier clase que hereda de ella tiene una propiedad Objects en la que se pueden guardar TObject's vinculados a cada cadena. La ventaja es que, por ejemplo, la podemos asignar a la propiedad Items de un combo y hacer que el usuario elija uno de nuestros objetos. Yo siempre que he neceistado listas de objetos he trabajado o con TObjectList o con TStrings (TStringList habitualmente) en función de si necesitaba una String representativa de cada objeto o no.
__________________
E pur si muove |
#6
|
|||
|
|||
Hola:
Me gustan vuestras respuestas y siempre es bueno tener más de una alternativa para hacer las cosas... Como usuario nuevo de Delphi que soy, no tengo mucha base para dar una opinión del tema (por eso pregunté !!), pero me parece que cualquier clase que utilice Hashing para las búsquedas, hará que estas sean más eficientes. Quisá se pueda lograr almacenar y recuperar lo mismo con TString, pero cuando son muchos ítems, la diferencia debe estar en la velocidad de búsqueda.... (creo haber leído algo de eso por ahí.....) Roy |
#7
|
||||
|
||||
Hola Marto,
solo un comentario, THashedStringList es un descendiente de TStrings, con lo que en teoria tamibén puede asignarse su valor a los items de un Combo. Saludos. Última edición por __marcsc fecha: 30-07-2003 a las 10:32:49. |
#8
|
||||
|
||||
Pues tiees razón Marc, THashedStringList hereda de TStringList y de hecho solo sobreescribe el destructor (que nos es igual)) y los mètodos IndexOf e IndexOfName, es decir los mètodos de búsqueda sobre la lista.
En conclusión, yo me quedaría con esta clase para el proposito que se plantea en el hilo.
__________________
E pur si muove |
#9
|
||||
|
||||
Muchachos, no quiero parece repetitivo, pero en el link que le he recomendado habla también del uso de TStrings
Cita:
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#10
|
||||
|
||||
Hola de nuevo
La verdad es que no acabo de entender el propósito de tu mensaje... Por lo que yo entendí lo que venía a decir Marto es que es interesante tener un descente de TStrings dado que de este modo tenemos compatibilidad con otros objetos/componentes. Por cierto, que leyendo el enlace que proponías no he visto la jerarquía de esa clase, y tampoco bajé el código, por lo que no veo si esa clase es descendiente de TStrings. En todo caso, dado que THashedStringList redefine o introduce los métodos IndexOf y IndexOfName es de esperar que estas dos operaciones sean (o tengan tendencia a ser) también de orden O(1) en lugar de O(n) como el IndexOf de TStrings. No lo puedo confirmar porqué no he mirado el código y la verdad es que ahora no tengo muchas ganas, pero vamos, esta es la idea del hashing, no? jejeje De todos modos como ya dije a mi me parece más completa la clase de tu enlace dado que permite indexar directamente, sin necesidad de utilizar métodos, lo que pasa que THashedStringList está disponible sin necesidad de bibliotecas externas y además seguro que es descendiente de TStrings. Saludos compañero Última edición por __marcsc fecha: 30-07-2003 a las 16:17:40. |
#11
|
||||
|
||||
El propósito es simple, pero no me daban ganas de hacer una explicación larga. El tema es que si THashedStringList desciende de TStrings entonces THashedStringList no es netamente una HashTable como bien dice el texto que he copiado en inglés, los TStrings no utilizan hashing. Ahora si la finalidad es utilizar una lista "cosas" a la que pueda acceder por un Key, sin importarnos la metodología y/o velocidad, pues recomiendo usar TStrings, porque obviamente son mucho mas "naturales" para Delphi.
Aclaro que no he visto la clase THashedStringList, solo me guió por los comentarios expuestos en este hilo. Simplemente en el mensaje quería remarcar lo que decía el link! Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#12
|
|||
|
|||
Hola denuevo:
Cita:
Puedo crear un TStringList, pero cada ítem es encontrado por un índice.... y yo necesito poder encontrar un ítem utilizando una clave.... Muchas gracias por todos sus aportes y comentarios. Roy |
#13
|
||||
|
||||
Cita:
Lo que no te perdono es que por culpa de tu mensaje me has obligado a mirar el código fuente cuando yo realmente no tenía ganas. Esta me la apunto Ahora en serio, esta es la declaración de la clase Código:
THashedStringList = class(TStringList) private FValueHash: TStringHash; FNameHash: TStringHash; FValueHashValid: Boolean; FNameHashValid: Boolean; procedure UpdateValueHash; procedure UpdateNameHash; protected procedure Changed; override; public destructor Destroy; override; function IndexOf(const S: string): Integer; override; function IndexOfName(const Name: string): Integer; override; end; Código:
function THashedStringList.IndexOf(const S: string): Integer; begin UpdateValueHash; if not CaseSensitive then Result := FValueHash.ValueOf(AnsiUpperCase(S)) else Result := FValueHash.ValueOf(S); end; Ahora la cuestión es qué hace realmente la clase TStringHash. Realmente lo único que hace es la típica estructura de Hash, es decir una tabla estática de N posiciones. La ubicación de cada elemento se decide aplicandole una función de Hash. Las colisiones se gestionan del siguiente modo. Cada item de la tabla es un apuntador a una variable de tipo PPHashItem: Código:
PPHashItem = ^PHashItem; PHashItem = ^THashItem; THashItem = record Next: PHashItem; Key: string; Value: Integer; end; Como vemos es una solución un poco híbrida y chapuzilla pero que yo considero totalmente válida en lo que respecta a la eficiencia. Saludos! |
#14
|
||||
|
||||
Cita:
Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
|