lunes, noviembre 06, 2006

SmartSort v1: ordenar una lista de string en base a una clave en C# .NET

Éste método nos ayuda a ordenar una linkedlist de string en c# en base a una clave, ordenando de menor a mayor grado de parecido.
Muy útil para el manejo de cadenas ordenadas.


//funcion para reordenar la lista de la forma mas eficiente
public System.Collections.Generic.LinkedList smartSort(
System.Collections.Generic.LinkedList lista,
string clave){

char[] auxs;
LinkedList auxl;
int nmatch;
int longi;

//creo un array de linkedlist de tamaño clave*2+1
LinkedList[] clasi = new LinkedList[clave.Length*2 + 1];

//obtengo los caracteres de la clave
char[] clavec = clave.ToCharArray(0,clave.Length);

//para cada una de las palabras de la lista inicial
IEnumerator enu = lista.GetEnumerator();
while (enu.MoveNext()){
nmatch = 0;
auxs = ((string)enu.Current).ToCharArray();

//me quedo con la menor de las longitudes
longi=clave.Length;
if (((string)enu.Current).Length < longi =" ((string)enu.Current).Length;" i =" 0;" i =" longi-1;">=0; i--){
if (clavec[i] == auxs[i]) nmatch++;
}

//si nmatch==0 introduzco la diferencia de longitudes como distancia
if (nmatch == clave.Length*2){
nmatch = nmatch - Math.Abs(clave.Length - enu.Current.ToString().Length);
//controlo los limites permitidos
if (nmatch > clave.Length * 2) nmatch = clave.Length * 2;
}

//clasifico esta palabra
if (clasi[nmatch] == null) clasi[nmatch]=new LinkedList();
clasi[nmatch].AddLast(enu.Current.ToString());
}

//creo la lista a devolver
auxl = new LinkedList();
for (int i = clave.Length * 2; i >= 0; i--){
if (clasi[i] != null) {
enu = clasi[i].GetEnumerator();
while (enu.MoveNext()){
auxl.AddLast(enu.Current.ToString());
}
}
}

//devuelvo la lista
return auxl;
}


//claves: ordenar lista palabras clave c# .net order list linkedlist words key

1 comentario:

pedromateo dijo...

se puede hacer más eficiente si consideramos pares de palabra-valor, donde el valor es "nmatch", utilizándolo para llevar a cabo las inserciones directamente en la lista a devolver.