Сравнение строк по алфавиту

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

Я хочу сравнить две приведенные выше строки по их алфавитному порядку (в данном случае «Project», затем «Sunject», поскольку «P» стоит перед «S»). Кто-нибудь знает, как это сделать на Java?

Макки
источник

Ответы:

122

String.compareTo может быть или не быть тем, что вам нужно.

Взгляните на эту ссылку, если вам нужно локализованное упорядочение строк.

Бухб
источник
8
Обратите внимание, что при String#compareToлексикографическом сравнении заглавная буква «Z» будет сортироваться перед строчной буквой «а». Если вы располагаете строки в смешанном регистре по алфавиту, вам потребуется упорядочение с учетом языковых стандартов. В случае, если ссылка на локализованное упорядочивание строк не работает, следует использовать java.text.Collator .
Маркеры дуэлей
41
Вы также можете использоватьString#compareToIgnoreCase
Дори
1
Вы также должны иметь дело с accentued письма см stackoverflow.com/a/12927962/2087666
Remi Morin
94

Взгляните на String.compareToметод.

s1.compareTo(s2)

Из javadocs:

Результатом является отрицательное целое число, если этот объект String лексикографически предшествует строке аргумента. Результатом является положительное целое число, если этот объект String лексикографически следует за строкой аргумента. Результат равен нулю, если строки равны; compareTo возвращает 0 именно тогда, когда метод equals (Object) возвращает true.

кендырь
источник
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
источник
7

Вы можете вызвать метод compareTo любой строки (java.lang.String.compareTo). Эта функция хорошо документирована на сайте документации Java .

Вот короткая программа, демонстрирующая это:

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

Вот живая демонстрация, которая показывает, как это работает: http://ideone.com/Drikp3

Василий Шарапов
источник
6

Для алфавитного порядка после национализации используйте 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");
}

Список поддерживаемых локалей см. В разделе Поддерживаемые локали JDK 8 и JRE 8 .

Ондра Жижка
источник
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]);
        }
   }
}
Малик Арман
источник
0

Как предлагали другие, вы можете использовать String.compareTo(String).

Но если вы сортируете список строк и вам нужен Comparator, вам не нужно его реализовывать, вы можете использовать Comparator.naturalOrder()или Comparator.reverseOrder().

арена
источник