BotonMenu
BotonIndice

Visita : conoce3000.com
Paypal : https://www.paypal.com/donate/?hosted_button_id=XY8TZ3MGN64GE

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


14. LISTA DE CADENAS TSTRINGLIST.
14.6. ORDENANDO TSTRINGLIST.
14. LISTA DE CADENAS TSTRINGLIST.
14.6. ORDENANDO TSTRINGLIST.
14. LISTA DE CADENAS TSTRINGLIST.
14.6. ORDENANDO TSTRINGLIST.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Ordenando TStringList.

La clase TStringList, permite tener ordenado la lista de cadena de caracteres, pero sólo de acuerdo al alfabeto latin, Ya que TStringList solo trabaja con caracteres ANSI. Es decir una lista como la siguiente:

Zoila Santillana
Carlos Sifuentes
Bernardo Alvarado
Andrés Manrique

Se puede ordenar en:

Andrés Manrique
Bernardo Alvarado
Carlos Sifuentes
Zoila Santillana

Para ordenar una Lista de cadenas de caracteres sólo debemos usar el método Sort. Ejemplo:


Descargar
{$codepage utf8}
{$mode objfpc}

Uses sysutils, classes
{$ifdef Linux},cwstring{$endif};

Var ListaCadenas:TStringList;
Begin
  ListaCadenas:=TStringList.create;

  ListaCadenas.Add('Zoila Santillana');
  ListaCadenas.Add('Carlos Sifuentes');
  ListaCadenas.Add('Bernardo Alvarado');
  ListaCadenas.Add('Andrés Manrique');
  ListaCadenas.Sort;
  Writeln(ListaCadenas.Text);
End.
Código fuente 27: Uso de Sort.
Descargar

También se le puede indicar a TStringList, que coloque los nuevos elementos en la lista de manera ordenada, esto se consigue colocando verdadero a la propiedad Sorted. No obstante si la lista ya tenia otras cadenas de caracteres sin ordenar, estas se deben ordenar antes de poner Sorted a true, es decir poner la propiedad Sorted a true no ordena la lista de cadena de caracteres. Cuando sorted tiene el valor true, entonces el método insert ya no funcionará o mejor dicho no debe usarse. Si intentamos usar el método insert entonces se lanzará una excepción EStringListError.


Descargar
{$codepage utf8}
{$mode objfpc}

Uses sysutils, classes
{$ifdef Linux},cwstring{$endif};

Var ListaCadenas:TStringList;
Begin
  ListaCadenas:=TStringList.create;
  ListaCadenas.Add('Olgado');
  ListaCadenas.Add('Carro');
  ListaCadenas.Add('Arriba');
  ListaCadenas.Sort;
  ListaCadenas.Sorted:=true;
  ListaCadenas.Add('Alegria');
  ListaCadenas.Add('Zorro');
  ListaCadenas.Add('Colorado');
  Writeln(ListaCadenas.Text)
End.
Código fuente 28: Uso de Sorted.
Descargar

Por defecto cuando ponemos a True la propiedad Sorted, el método Add no permitirá colocar elementos repetitivos, incluso si se diferencia en mayúsculas o minúsculas. Es decir si queremos colocar en un TStringList, dos o tres veces la palabra colorado, sólo se colocará una. Si queremos que nuestra lista de cadena de caracteres acepte duplicados, entonces se tiene que cambiar el atributo Duplicates asignando el valor duAccept. Duplicates es un tipo de dato enumerado denominado TDuplicates, que consta de tres valores dupIgnore, dupAccept y dupError. Por defecto Duplicates tiene el valor dupIgnore que debemos cambiarlo a dupAccept para que se puedan colocar elementos duplicados a la lista.


Descargar
{$codepage utf8}
{$mode objfpc}

Uses sysutils, classes
{$ifdef Linux},cwstring{$endif};

Var ListaCadenas:TStringList;
Begin
  ListaCadenas:=TStringList.create;
  ListaCadenas.Add('Olgado');
  ListaCadenas.Add('Carro');
  ListaCadenas.Add('Arriba');
  ListaCadenas.Sort;
  ListaCadenas.Sorted:=true;
  ListaCadenas.Duplicates:=dupAccept;
  ListaCadenas.Add('Alegria');
  ListaCadenas.Add('Zorro');
  ListaCadenas.Add('Colorado');
  ListaCadenas.Add('Colorado');
  ListaCadenas.Add('Colorado');
  ListaCadenas.Add('Colorado');
  Writeln(ListaCadenas.Text)
End.
Código fuente 29: Uso de Duplicate.
Descargar

Existe un atributo Casesensitive, que permitirá colocar elementos repetitivos en una lista, si estos se diferencian por tener algunos de sus caracteres en mayúsculas o minúsculas. Es decir si queremos colocar en un TStringList, dos o tres veces la palabra colorado, Colorado, COLORADO que como vemos se diferencia por tener algunos de sus caracteres en mayúsculas o minúsculas, sólo debemos poner el atributo Casesensitive a true. No obstante Casesensitive no hará que la lista se ordene considerando las mayúsculas como iguales a las minúsculas.


Descargar
{$codepage utf8}
{$mode objfpc}

Uses sysutils, classes
{$ifdef Linux},cwstring{$endif};

Var ListaCadenas:TStringList;
Begin

  ListaCadenas:=TStringList.create;
  ListaCadenas.Sorted:=true;
  ListaCadenas.Add('Olgado');
  ListaCadenas.Add('Carro');
  ListaCadenas.Add('Arriba');
  ListaCadenas.Add('Colorado');
  ListaCadenas.Add('COlorado');
  ListaCadenas.Add('COLORADO');
  ListaCadenas.Add('ColoraDO');
  Writeln(ListaCadenas.Text);

  ListaCadenas:=TStringList.create;
  ListaCadenas.Sorted:=true;
  ListaCadenas.Casesensitive:=true;
  ListaCadenas.Add('Olgado');
  ListaCadenas.Add('Carro');
  ListaCadenas.Add('Arriba');
  ListaCadenas.Add('Colorado');
  ListaCadenas.Add('COlorado');
  ListaCadenas.Add('COLORADO');
  ListaCadenas.Add('ColoraDO');
  Writeln(ListaCadenas.Text);
End.
Código fuente 30: Uso de Casesensitive.
Descargar

Las técnicas antes mencionadas están sólo limitadas a ordenar las lista de cadena de caracteres en orden ascendente, pero si necesitamos ordenar en orden descendente, entonces necesitamos usar nuestra propia rutina de comparación tal como se hizo para listas y colecciones; y además también necesitamos el método CustomSort que sería el equivalente al método Sort utilizado en Listas y Colecciones. Antes debemos implementar una función de comparación como la siguiente:

Function Comparar(i,j:ansistring):integer;
    Begin
      if i=j then Comparar:=0
      else if i>j then Comparar:=1
      else Comparar:=-1
    End;

La función comparar debe devolver 0 cuando ambas cadenas de caracteres sean iguales, un 1 cuando la primera cadena de caracteres sea mayor que la segunda, y -1 en caso contrario.

Esta rutina en realidad no se puede usar con CustomSort, ya que CustomSort requiere de una rutina similar que incluya un parámetro adicional TStringList. Con lo que necesitaremos de dos rutinas más Ascendente y Descendente, que se usarán con CustomSort.

Function Ascendente(List: TStringList; Index1, Index2: Integer): Integer;
    Begin
      Result := Comparar(List[Index1], List[Index2]);
    End;
Function Descendente(List: TStringList; Index1, Index2: Integer): Integer;
    Begin
      Result := Comparar(List[Index2], List[Index1]);
    End;

Tal como se puede observar, para que CustomSort ordene la lista de modo descendente, solo basta comparar las cadenas de caracteres al revés. A continuación el ejemplo completo.


Descargar
{$codepage utf8}
{$mode objfpc}

Uses sysutils, classes
{$ifdef Linux},cwstring{$endif};

function Comparar(i,j:ansistring):integer;
  Begin
    if i=j then Comparar:=0
    else if i>j then Comparar:=1
    else Comparar:=-1
  End;


function Descendente(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := Comparar(List[Index2], List[Index1]);
end;

function Ascendente(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := Comparar(List[Index1], List[Index2]);
end;

Var ListaCadenas:TStringList;
Begin
  Writeln('== Ascendente usando Sorted ==');
  ListaCadenas:=TStringList.create;
  ListaCadenas.Add('Olgado');
  ListaCadenas.Add('Carro');
  ListaCadenas.Add('Arriba');
  ListaCadenas.Sort;
  ListaCadenas.Sorted:=true;
  ListaCadenas.Duplicates:=dupAccept;
  ListaCadenas.Add('Alegria');
  ListaCadenas.Add('Zorro');
  ListaCadenas.Add('Colorado');
  ListaCadenas.Add('Colorado');
  ListaCadenas.Add('Colorado');
  ListaCadenas.Add('Colorado');
  Writeln(ListaCadenas.Text);
  ListaCadenas.Sorted:=false;

  Writeln('== Descendente usando Custom Sort ==');
  ListaCadenas.CustomSort(@Descendente);
  Writeln(ListaCadenas.Text);

  Writeln('== Ascendente usando Custom Sort ==');
  ListaCadenas.CustomSort(@Ascendente);
  Writeln(ListaCadenas.Text)
End.
Código fuente 31: Uso de CustomSort.
Descargar

Cuando usamos CustomSort, siempre debemos desactivar sorted, es decir sorted debe colocarse a false, ya que si no lo hacemos la lista quedará siempre ordenada ascendentemente, aunque se use CustomSort.

El método Find de TStringList es un método que nos permite realizar una búsqueda en una lista de cadenas de caracteres ordenada, es un método que tiene dos parámetros el primero es la cadena de caracteres que se buscará y el segundo parámetro la posición en donde se encontró la cadena de caracteres. Este método nos devolverá verdadero si encuentra la cadena de caracteres en la lista y en su segundo parámetro la posición en donde lo encontró, pero si no lo encuentra devolverá falso y en su segundo parámetro la posición en donde podríamos insertar la nueva cadena de caracteres respetando el orden de la lista de caracteres.


Descargar
{$codepage utf8}
{$mode objfpc}

Uses sysutils, classes
{$ifdef Linux},cwstring{$endif};

Var ListaCadenas:TStringList;
    pos:integer;
Begin
  ListaCadenas:=TStringList.create;
  ListaCadenas.Add('Zoila');
  ListaCadenas.Add('Rosa');
  ListaCadenas.Add('Sara');
  ListaCadenas.Add('Andrea');
  ListaCadenas.Add('Miguel');
  ListaCadenas.Add('Felipe');
  Writeln;
  ListaCadenas.Sort;
  Writeln(ListaCadenas.Text);

  if ListaCadenas.Find('Felipe',pos)
  then Writeln('Felipe se encuentra en ',pos,',no se inserta')
  else ListaCadenas.insert(pos,'Felipe');

  if ListaCadenas.Find('Carla',pos)
  then Writeln('Carla Se encuentra en ',pos,',no se inserta')
  else ListaCadenas.insert(pos,'Carla');

  Writeln(ListaCadenas.Text)
End.
Código fuente 32: Uso de Find.
Descargar




SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo a través de , que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado. Para clases particulares contactame por whatsapp al 📲 (+51) 999 264 073








PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.