Java, как сортировать строчные буквы перед строками верхнего регистра

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

files2.add("b");
files2.add("A");
files2.add("a");
files2.add("B");

порядок с этим кодом: [A, B, a, b] Я хочу, чтобы это было: [a, A, b, B]

import java.io.File;
import java.util.*;

public class Abs {

    public ArrayList<File> getOrder(ArrayList<File> files) {
        Collections.sort(files, new Comparator<File>() {
            public int compare(File file1, File file2) {
                return file1.getAbsolutePath().compareTo(file2.getAbsolutePath());
            }
        });
        return files;
    }

}

Ответ 1

Отметьте класс Collator.

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

Ответ 2

Возможно, вы можете использовать классы библиотеки или утилиты с таким поведением, или вы можете создать свой собственный компаратор.

    new Comparator<File>() {
        public int compare(File file1, File file2) {
            // Case-insensitive check
            int comp = file1.getAbsolutePath().compareToIgnoreCase(file2.getAbsolutePath())
            // If case-insensitive different, no need to check case
            if(comp != 0) {
                return comp;
            }
            // Case-insensitive the same, check with case but inverse sign so upper-case comes after lower-case
            return (-file1.getAbsolutePath().compareTo(file2.getAbsolutePath()));
        }
    }

Ответ 3

Вы можете реализовать свой собственный Comparator, который, в свою очередь, использует Collator. См. пример.

Ответ 4

Попробуйте эту простую реализацию:

public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            list.add("a");
            list.add("b");
            list.add("A");
            list.add("B");
            System.out.println(list);
            Collections.sort(list, new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                            if (o1.toLowerCase().equals(o2.toLowerCase())) {
                                    if (o1.toLowerCase().equals(o1)) {
                                            return -1;
                                    } else {
                                            return  1;
                                    }
                            } else {
                                    return o1.toLowerCase().compareTo(o2.toLowerCase());

                            }
                    }
            });
            System.out.println(list);
    }

Ответ 5

Как было предложено другими, Collator делает то, что вы хотите. Написание одного из этих правил сортировки выглядело немного страшно, но похоже, что стандартный английский Collator выполняет именно то, что вы хотите:

public static void main(String... args)
{
    List<String> items = Arrays.asList("b", "A", "a", "B");
    Collections.sort(items, Collator.getInstance(Locale.ENGLISH));
    System.out.println(items);
}

дает:

[a, A, b, B]

Ответ 6

Collections.sort(); позволяет передать пользовательский компаратор для заказа. Для упорядочения без учета регистра класс String предоставляет статический конечный компаратор с именем CASE_INSENSITIVE_ORDER.

Так что в вашем случае все, что нужно, это:

Collections.sort(caps, String.CASE_INSENSITIVE_ORDER);