2010-08-04 18 views
9

¿Cómo puedo ordenar un arreglo por primera vez por la longitud, después alfabéticamente?Ordenar un array primero por la longitud después alfabéticamente en Java

tengo una lista de cosas con números en ellos, y actualmente estoy recibiendo:

Something1 Something10 Something2 Something3

Mientras que quiero llegar:

Something1 Something2 Something3 Something10

+1

Por casualidad, la tarea? –

+0

No, solo tengo un montón de archivos que quería cambiar el nombre muy rápido. Están numerados, pero los números deben cambiar un poco y el resto del nombre del archivo cambió. Pero el orden natural por parte del sistema operativo generalmente devuelve 1 10 11 12 13 14 15 16 17 18 19 2 20 etc. – Brian

+1

¿Ha intentado simplemente usar ceros a la izquierda en sus números? IE, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11. –

Respuesta

24
public class MyComparator implements Comparator<String>{ 
    @Override 
    public int compare(String o1, String o2) { 
     if (o1.length() > o2.length()) { 
     return 1; 
     } else if (o1.length() < o2.length()) { 
     return -1; 
     } 
     return o1.compareTo(o2); 
    } 
} 

continuación, utilice:

Collections.sort(yourList, new MyComparator()); 
+0

El comparador requiere int compareTo (Obj o), no se compara (Object o1, Object o2). Este código está cerca sin embargo. – Starkey

+3

@Starkey: Eso es comparable. Este es el Comparador. Sin embargo, estabas cerca. –

+0

Gracias, solo necesitaba ordenar algunos nombres de archivos que tenían números en ellos muy rápido y cambiarles el nombre. Los tenía en una matriz, así que tuve que convertirlo en una colección, pero esto funcionó para mi propósito. ¡Gracias! – Brian

4

Cree un comparador que compare primero por longitud y si las longitudes son las mismas, usa String.compareTo ()

+0

También tenga en cuenta la existencia de 'compareToIgnoreCase()'. –

1

Ordenando primero por la longitud y luego léxico sólo funcionará si los prefijos de cadena (es decir, la parte antes del número) es la misma longitud en todos los casos. Creo que realmente puede querer escribir un comparador que separe la cadena y las partes numéricas, y ordene alfabéticamente en la cadena y numéricamente en la parte del número.

0

definir una clase para mantener su artículo en. Parece que usted quiere que sea una cadena.

Para esa clase, debe definir la interfaz Comparable y poner la lógica para comparar en su método abstracto.

 
int compareTo(T o) 

Por ejemplo:

 
class MyString extends String 
{ 
    @Override 
    int compareTo(Object obj) 
    { 
    // put your logic in here. 
    // Return -1 if this is "less than" obj. 
    // Return 0 if this is equal to obj 
    // Return 1 if this is "greater than" obj. 

    // Test length first 
    if (length() < obj.length()) 
     return -1; 
    if (length() > obj.length()) 
     return 1; 

    // Lengths are the same, use the alphabetical compare defined by String already 
    return super.compareTo(obj); 
    } 
} 

exención de responsabilidad, que en realidad no probar este código, pero debe estar cerca de lo que desea.

7

Aquí es una solución concisa de Java 8:

List<String> list = Arrays.asList("Something1", "Something10", "Something2", "Something3"); 
list.sort(Comparator.comparing(String::length).thenComparing(String::compareTo)); 

O, entre mayúsculas y minúsculas versión:

list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase)); 
Cuestiones relacionadas