2010-08-04 5 views
9

Comment trier un tableau d'abord par longueur, puis par ordre alphabétique?Trier le tableau d'abord par longueur puis par ordre alphabétique en Java

J'ai une liste de choses avec des numéros, et je reçois actuellement:

Something1 Something10 Something2 Something3

Alors que je veux faire:

Something1 Something2 Something3 Something10

+1

Par hasard, les devoirs? –

+0

Non, juste une tonne de fichiers que je voulais renommer très rapidement. Ils sont numérotés, mais les nombres doivent être décalés d'un peu et le reste du nom de fichier a changé. Mais la commande naturelle par le système d'exploitation renvoie généralement 1 10 11 12 13 14 15 16 17 18 19 2 20 etc. – Brian

+1

Avez-vous essayé d'utiliser seulement des zéros de tête dans vos nombres? IE, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11. –

Répondre

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); 
    } 
} 

Ensuite, utilisez:

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

Le comparateur nécessite int compareTo (Obj o), pas de comparaison (Object o1, Object o2). Ce code est proche cependant. – Starkey

+3

@Starkey: C'est comparable. C'est un comparateur. Tu étais proche quand même. –

+0

Merci, j'avais juste besoin de trier certains noms de fichiers qui contenaient des nombres très rapidement et de les renommer. Je les avais dans un tableau, donc j'ai dû le convertir en une collection, mais cela a fonctionné pour mon but. Merci! – Brian

4

Créer un comparateur qui se compare d'abord par la longueur et si les longueurs sont les mêmes, utilise le String.compareTo ().

+0

Notez également l'existence de 'compareToIgnoreCase()'. –

1

Tri d'abord par la longueur et lexicalement ne fonctionnera que si les préfixes de chaîne (à savoir la partie avant le numéro) est la même longueur dans tous les cas. Je crois que vous pouvez vraiment écrire un comparateur qui sépare la chaîne et les parties numériques et les trier par ordre alphabétique sur la chaîne et numériquement sur la partie numérique.

0

Définissez une classe pour contenir votre élément. Vous semblez que ce soit une chaîne.

Pour cette classe, vous devez définir l'interface Comparable et mettre la logique à comparer dans sa méthode abstraite.

 
int compareTo(T o) 

Par exemple:

 
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); 
    } 
} 

Avertissement, je ne teste pas réellement ce code, mais il devrait être proche de ce que vous voulez.

7

Voici une solution concise Java 8:

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

Ou, version insensible à la casse:

list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase)); 
Questions connexes