Ordenamiento De Cadenas Por LongitudTienes una lista de cadenas y quieres ordenarlas según su longitud, de la más corta a la más larga. Esta misma solución se puede aplicar cambiando el criterio: alfabeticamente, mayor número de vocales, etc. Aquí expongo diferentes implementaciones de la misma estrategia en Java, C#, C++, PowerShell y C# con LinQ. IntroducciónComo buen programador una de las cosas que más odio es hacer algo más de una vez, y lo que odio aún más es tener que explicar lo mismo más de una vez a una o varias personas, así que decidí publicar en mi Blog las respuestas a las preguntas más solicitadas por todos aquellos que me acosan en el correo electrónico, Messenger, celular, etc. (No se hagan ustedes saben quienes son). El siguiente problema es un clásico, desde estudiantes de primer semestre hasta administradores de sistemas me han preguntado lo mismo (o alguna variante). Inclusive un estudiante me comento que tenia ya un mes intentando resolver este problema (de que los hay, los hay). ProblemaTenemos una lista de cadenas y queremos ordenarlas de menor longitud a mayor longitud. Veamos pues un ejemplo:
SoluciónA continuación expondré la misma solución en diferentes lenguajes, la solución siempre es la misma, solo se necesita establecer el criterio de ordenamiento en la función o método de ordenamiento. Versión Java™Este va primero por que nada arruina más mi día que tener que hablar de este P PorLongitud.java
import java.util.Comparator; class PorLongitud implements Comparator { public int compare(Object o1, Object o2) { String a = (String) o1; String b = (String) o2; return ( a.length() < b.length() )?-1:1; } public boolean equals(Object o) { return this == o; } } Programa.java
import java.util.*; class Programa { public static void main(String[] args) { ArrayList lista = new ArrayList(); lista.add("Aeroacrofobia"); lista.add("Haba"); lista.add("No"); lista.add("Amaxofobia"); lista.add("Bienvenido"); lista.add("Palabra"); lista.add("Reflexología"); lista.add("Persa"); lista.add("Autómata"); lista.add("Iniciar"); lista.add("Allodoxafobia"); lista.add("Litros"); lista.add("Gasolina"); lista.add("Platano"); lista.add("Café"); lista.add("Importante"); lista.add("Aracnofobia"); for (Object o : lista) { System.out.println( o ); } Collections.sort(lista, new PorLongitud()); for (Object o : lista) { System.out.println( o ); } } } Versión C# (I love this language)Saber delegar es la característica más importante de un buen
class Program { static void Main(string[] args) { List<string> lista = new List<string>() { "Aeroacrofobia", "Haba", "No", "Amaxofobia", "Bienvenido", "Palabra", "Reflexología", "Persa", "Autómata", "Iniciar", "Allodoxafobia", "Litros", "Gasolina", "Platano", "Café", "Importante", "Aracnofobia" }; lista.ForEach(delegate(string item){ System.Console.WriteLine(item); }); lista.Sort(delegate(string a, string b) { return a.Length.CompareTo(b.Length); }); lista.ForEach(delegate(string item){ System.Console.WriteLine(item); }); } } Puedes descargar el código para Visual Studio 2008 aquí: Para aquellos interesados en LinQ al final de este bloque presento la solución usando solamente LinQ(Para que vean que bonito se programa en C#). Versión C++
#include <iostream> #include <list> #include <string> #include <algorithm> using namespace std; bool PorLogitud(string a, string b) { return ( a.length() < b.length() ); } int main() { list<string> ListaCadenas; list<string>::iterator it; ListaCadenas.push_back ("Aeroacrofobia"); ListaCadenas.push_back ("Haba"); ListaCadenas.push_back ("No"); ListaCadenas.push_back ("Amaxofobia"); ListaCadenas.push_back ("Bienvenido"); ListaCadenas.push_back ("Palabra"); ListaCadenas.push_back ("Reflexología"); ListaCadenas.push_back ("Persa"); ListaCadenas.push_back ("Autómata"); ListaCadenas.push_back ("Iniciar"); ListaCadenas.push_back ("Allodoxafobia"); ListaCadenas.push_back ("Litros"); ListaCadenas.push_back ("Gasolina"); ListaCadenas.push_back ("Platano"); ListaCadenas.push_back ("Café"); ListaCadenas.push_back ("Importante"); ListaCadenas.push_back ("Aracnofobia"); ListaCadenas.sort(PorLogitud); cout << "Mi Lista:" << endl; for (it=ListaCadenas.begin(); it!=ListaCadenas.end(); ++it) cout << *it << endl; return 0; } Versión PowerShell
PS > Get-content -Path cadenas.txt | Sort-Object -Property Length
Versión C# Con LINQ (.NET 3.5)Haciendo uso de esta nueva característica este problema it’s a fuking peace of cake. Veamos el código:
public static List<string> OrdenarPorLongitud(List<string> lista) { var ordenado = from cadena in lista orderby cadena.Length ascending select cadena; return ordenado.ToList(); } ¿La quieren aún más fácil?, pues ahí les va con expresiones Lamda:
class Program { static void Main(string[] args) { List<string> lista = new List<string>() { "Aeroacrofobia", "Haba", "No", "Amaxofobia", "Bienvenido", "Palabra", "Reflexología", "Persa", "Autómata", "Iniciar", "Allodoxafobia", "Litros", "Gasolina", "Platano", "Café", "Importante", "Aracnofobia" }; lista.ForEach(delegate(string item){ System.Console.WriteLine(item); }); lista.Sort( (a,b) => a.Length.CompareTo(b.Length) ); lista.ForEach(delegate(string item){ System.Console.WriteLine(item); }); } } ConclusiónNo hay razón para reinventar la rueda, el programador más listo es aquel que se duerme más temprano.
Trackback URI: http://blog.ernestohs.com/index.php/trackback/6
titanpoker bonus otmi: titanpoker bonus / 13 Noviembre 2009
titanpoker bonus
titan poker zhlt: titan poker / 13 Noviembre 2009
titan poker
pelaa poker fjeq: pelaa poker / 15 Noviembre 2009
pelaa poker
pelaa pokeria vfic: pelaa pokeria / 15 Noviembre 2009
pelaa pokeria
full tilt poker zmii: full tilt poker / 17 Febrero 2010
full tilt poker
Fuentes XML de comentario: RSS | Atom
|
Dejar un comentario