Порівняння рядків за їх алфавітним порядком


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

Я хочу порівняти два вище рядки за їх алфавітним порядком (який у цьому випадку "Project", а потім "Sunject" як "P" надходить до "S"). Хтось знає, як це зробити на Java?

Відповіді:


121

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 саме тоді, коли метод рівняння (Object) поверне справжнє значення.


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
} 

7

Ви можете зателефонувати до методу сравнениеTo або рядка (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).

Але якщо ви сортуєте список рядків і вам потрібен a Comparator, вам не потрібно його реалізовувати, ви можете використовувати Comparator.naturalOrder()або Comparator.reverseOrder().

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.