11

我希望文件按它们的绝对路径名排序,但我希望小写字母在大写字母之前排序。示例:假设我有 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;
    }

}
4

6 回答 6

6

检查Collat​​or 类

您必须仔细阅读这些常量的含义,但其中之一应该可以让您将小写字母放在大写字母之前。

于 2013-05-07T16:53:31.053 回答
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()));
        }
    }
于 2013-05-07T17:15:09.680 回答
2

正如其他人所建议的那样,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]
于 2013-05-09T07:25:20.903 回答
2

Collections.sort(); 让您通过自定义比较器进行排序。对于不区分大小写的排序,String 类提供了一个名为 CASE_INSENSITIVE_ORDER 的静态最终比较器。

所以在你的情况下,所有需要的是:

Collections.sort(caps, String.CASE_INSENSITIVE_ORDER);

于 2019-10-16T12:59:19.093 回答
1

您可以实现自己的Comparator,而后者又使用Collator. 见例子

于 2013-05-07T16:54:11.453 回答
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);
    }
于 2013-05-08T02:38:27.153 回答