Подтвердить что ты не робот

Простой способ сортировки строк в алфавитном порядке (с учетом регистра)

Мне нужно отсортировать список строк в алфавитном порядке:

List<String> list = new ArrayList();
list.add("development");
list.add("Development");
list.add("aa");
list.add("AA");
list.add("Aa");

Обычный способ сделать это - использовать компаратор:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

Проблема CaseInsensitiveComparator состоит в том, что "AA" равно "aa". Строки появляются в результате в соответствии с порядком добавления для тех же значений, и это неверно:

"aa","AA","Aa","development","Development"
4b9b3361

Ответ 1

Если вы не хотите добавлять зависимость от Guava (на ответ Майкла), то этот компаратор эквивалентен:

private static Comparator<String> ALPHABETICAL_ORDER = new Comparator<String>() {
    public int compare(String str1, String str2) {
        int res = String.CASE_INSENSITIVE_ORDER.compare(str1, str2);
        if (res == 0) {
            res = str1.compareTo(str2);
        }
        return res;
    }
};

Collections.sort(list, ALPHABETICAL_ORDER);

И я думаю, что это так же легко понять и закодировать...

Последние 4 строки метода могут быть написаны более сжато следующим образом:

        return (res != 0) ? res : str1.compareTo(str2);

Ответ 2

Простым способом решения проблемы является использование ComparisonChain из Guava http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ComparisonChain.html

private static Comparator<String> stringAlphabeticalComparator = new Comparator<String>() {
        public int compare(String str1, String str2) {
            return ComparisonChain.start().
                                compare(str1,str2, String.CASE_INSENSITIVE_ORDER).
                                compare(str1,str2).
                                result();
         }
 };
Collections.sort(list, stringAlphabeticalComparator);

Первый компаратор из цепочки будет сортировать строки в соответствии с регистрозависимым порядком, а второй компаратор будет сортировать строки в соответствии с регистрозависимым порядком. Так как исключенные строки появляются в результате в алфавитном порядке:

"AA","Aa","aa","Development","development"

Ответ 3

Недавно я ответил на аналогичный вопрос здесь. Применение такого же подхода к вашей проблеме приведет к следующему решению:

list.sort(
  p2Ord(stringOrd, stringOrd).comap(new F<String, P2<String, String>>() {
    public P2<String, String> f(String s) {
      return p(s.toLowerCase(), s);
    }
  })
);

Ответ 4

Просто используйте

java.util.Collections.sort(list)

без параметра сравнения String.CASE_INSENSITIVE_ORDER.

Ответ 5

import java.util.Arrays;
import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {

        String a;
        String b;
        try (Scanner scan = new Scanner(System.in)) {
            a = scan.next();
            b = scan.next();
        }
        boolean ret = isAnagram(a, b);
        System.out.println((ret) ? "Anagrams" : "Not Anagrams");

    }

    static boolean isAnagram(String a, String b) {
        int l1 = a.length();
        int l2 = b.length();
        boolean rat = false;

        if (l1 <= 50) {
            if (l1 == l2) {

                char[] chars1 = a.toLowerCase().toCharArray();
                char[] chars2 = b.toLowerCase().toCharArray();
                Arrays.sort(chars1);
                Arrays.sort(chars2);
                String Ns1 = new String(chars1);
                String Ns2 = new String(chars2);
                if (Ns1.equals(Ns2)) {
                    rat = true;
                }
            }
        }
        return rat;
    }
}