Muy útil para el manejo de cadenas ordenadas.
//funcion para reordenar la lista de la forma mas eficiente
public System.Collections.Generic.LinkedListsmartSort(
System.Collections.Generic.LinkedListlista,
string clave){
char[] auxs;
LinkedListauxl;
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:
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.
Publicar un comentario