我希望文件按其abs路径名排序,但我希望小写字母在大写之前排序。示例:假设我有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;
}
}
答案 0 :(得分:6)
你必须仔细阅读这些常量的含义,但其中一个应该可以让你在大写字母之前加上小写字母。
答案 1 :(得分:1)
您可以实施自己的Comparator
,而Collator
又使用{{1}}。请参阅example。
答案 2 :(得分:1)
您可以使用具有此行为的库或实用程序类,或者您可以构建自己的比较器。
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 :(得分:1)
尝试这个简单的实现:
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);
}
答案 4 :(得分:1)
正如其他人所建议的那样,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]
答案 5 :(得分:0)
Collections.sort();使您可以传递自定义比较器进行订购。对于不区分大小写的排序,String类提供了一个称为CASE_INSENSITIVE_ORDER的静态最终比较器。
因此,您需要做的只是:
Collections.sort(caps,String.CASE_INSENSITIVE_ORDER);