Comparaison des chaînes par ordre alphabétique

101
String s1 = "Project";
String s2 = "Sunject";

Je veux comparer les deux chaînes ci-dessus par leur ordre alphabétique (qui dans ce cas "Projet" puis "Sunject" comme "P" vient avant "S"). Est-ce que quelqu'un sait comment faire cela en Java?

Makky
la source

Réponses:

121

String.compareTo pourrait ou non être ce dont vous avez besoin.

Jetez un œil à ce lien si vous avez besoin d'un ordre localisé des chaînes.

Buhb
la source
8
Notez que String#compareTola comparaison lexicographique de s triera les majuscules "Z" avant les minuscules "a". Si vous classez par ordre alphabétique des chaînes à casse mixte, vous avez besoin d'un ordre sensible aux paramètres régionaux. Au cas où le lien vers l'ordre localisé des chaînes disparaît, la chose à utiliser est java.text.Collator .
marqueurs duelin
41
Vous pouvez également utiliserString#compareToIgnoreCase
Dori
1
Vous devez également faire face à la lettre accentuée voir stackoverflow.com/a/12927962/2087666
Remi Morin
94

Jetez un œil à la String.compareTométhode.

s1.compareTo(s2)

À partir des javadocs:

Le résultat est un entier négatif si cet objet String précède lexicographiquement la chaîne d'argument. Le résultat est un entier positif si cet objet String suit lexicographiquement la chaîne d'argument. Le résultat est zéro si les chaînes sont égales; compareTo renvoie 0 exactement lorsque la méthode equals (Object) renvoie true.

dogbane
la source
33
String a = "..."; 
String b = "...";  

int compare = a.compareTo(b);  

if (compare < 0) {  
    //a is smaller
}
else if (compare > 0) {
    //a is larger 
}
else {  
    //a is equal to b
} 
mdaguerre
la source
7

Vous pouvez appeler la méthode compareTo de l'une ou l'autre des chaînes (java.lang.String.compareTo). Cette fonctionnalité est bien documentée sur le site de documentation java .

Voici un petit programme qui le démontre:

class StringCompareExample {
    public static void main(String args[]){
        String s1 = "Project"; String s2 = "Sunject";
        verboseCompare(s1, s2);
        verboseCompare(s2, s1);
        verboseCompare(s1, s1);
    }

    public static void verboseCompare(String s1, String s2){
        System.out.println("Comparing \"" + s1 + "\" to \"" + s2 + "\"...");

        int comparisonResult = s1.compareTo(s2);
        System.out.println("The result of the comparison was " + comparisonResult);

        System.out.print("This means that \"" + s1 + "\" ");
        if(comparisonResult < 0){
            System.out.println("lexicographically precedes \"" + s2 + "\".");
        }else if(comparisonResult > 0){
            System.out.println("lexicographically follows \"" + s2 + "\".");
        }else{
            System.out.println("equals \"" + s2 + "\".");
        }
        System.out.println();
    }
}

Voici une démonstration en direct qui montre que cela fonctionne: http://ideone.com/Drikp3

Vasiliy Sharapov
la source
6

Pour l'ordre alphabétique après la nationalisation, utilisez Collator.

//Get the Collator for US English and set its strength to PRIMARY
Collator usCollator = Collator.getInstance(Locale.US);
usCollator.setStrength(Collator.PRIMARY);
if( usCollator.compare("abc", "ABC") == 0 ) {
    System.out.println("Strings are equivalent");
}

Pour une liste des paramètres régionaux pris en charge, consultez Paramètres régionaux pris en charge par JDK 8 et JRE 8 .

Ondra Žižka
la source
1
import java.io.*;
import java.util.*;
public class CandidateCode {
    public static void main(String args[] ) throws Exception {
       Scanner sc = new Scanner(System.in);
           int n =Integer.parseInt(sc.nextLine());
           String arr[] = new String[n];
        for (int i = 0; i < arr.length; i++) {
                arr[i] = sc.nextLine();
                }


         for(int i = 0; i <arr.length; ++i) {
            for (int j = i + 1; j <arr.length; ++j) {
                if (arr[i].compareTo(arr[j]) > 0) {
                    String temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for(int i = 0; i <arr.length; i++) {
            System.out.println(arr[i]);
        }
   }
}
malik arman
la source
0

Comme d'autres l'ont suggéré, vous pouvez utiliser String.compareTo(String).

Mais si vous triez une liste de chaînes et que vous avez besoin d'un Comparator, vous n'avez pas à l'implémenter, vous pouvez utiliser Comparator.naturalOrder()ou Comparator.reverseOrder().

arenaq
la source