Java 如何将小写字符串排在大写字符串之前进行排序

12

我希望按照文件的绝对路径名称进行排序,但是我希望小写字母排在大写字母前面。例如:假设我有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;
    }

}

3
“k.txt”应该比“G.txt”更小吗? - zw324
这是否限制于拉丁/英文字符集? - Varun Madiath
1
如果你的文件名中有大小写混合的字符,例如AaAa.txt和aAAA.txt,哪一个应该排在前面? - Madthew
1
一种方法可能是重写compareTo方法。将字符串当前位置的两个字母作为小写进行比较。如果它们相等,则检查它们的正常值,并优先考虑小写形式。 - Evo510
6个回答

6

请查看Collator类

你需要仔细阅读这些常量的含义,但其中一个常量应该可以让你将小写字母排在大写字母之前。


4

您可以使用带有此行为的库或实用程序类,也可以构建自己的比较器。

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

这个比较器将排序 [a, b, A, B]。我希望得到的是 [a, A, b, B]。 - Kuyo
从你最初的问题来看,那并不是很清楚,但是代码变得简单了许多。此外,你可能可以使用像Igor提供的库函数一样的函数。更新的代码。 - dtech
首先进行“忽略大小写比较”,然后只有在它们相等的情况下才进行“区分大小写比较”。如果我理解正确:这应该允许Smithsmith在排序列表中相邻。干得好。 - Jonathan

4

正如其他人所建议的那样,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]

2

Collections.sort(); 可以让您传递一个自定义比较器进行排序。为了不区分大小写的排序,String类提供了一个名为CASE_INSENSITIVE_ORDER的静态常量比较器。

所以在您的情况下,只需要这样做:

Collections.sort(caps, String.CASE_INSENSITIVE_ORDER);


1
你可以实现自己的 Comparator,然后使用 Collator。请参见example

0

尝试这个简单的实现:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接