4

目前我有一些代码可以获取文件名并以一些不同的方式对它们进行排序(区域设置敏感的自然排序、不区分大小写的 ASCII 排序、按修改日期等),例如,对于区域设置敏感的自然排序,它使用以下方法:

Collections.sort(files, new Comparator<File>() {
    @Override
    public int compare(File f1, File f2) {
        return NaturalComparator.compareNatural(collator, f1.getName(), f2.getName());
    }
});

我想知道如何让它忽略文件名开头的“the”这个词,所以不要像这样排序文件:

苹果
胡萝卜
香蕉

它像这样命令它们:

苹果
香蕉
胡萝卜

4

4 回答 4

6

The您可以在将其传递给比较器之前替换第一次出现的,使用String#replaceFirst(regex, replacement)orString.replaceAll(regex, replacement)方法,这两个方法都需要一个regex作为参数来替换,并且都可以在这里使用:-

@Override
public int compare(File f1, File f2) {
    return NaturalComparator.compareNatural(collator, 
                                          f1.getName().replaceAll("^(?i)The ", ""), 
                                          f2.getName().replaceAll("^(?i)The ", ""));
}  

在进行不 区分大小写的替换之前添加了一个(?i)标志 (感谢@Chris 指出这一点)。regex pattern

Caret (^)在模式之前添加,因此它仅替换The字符串开头的。因此,The banana将被替换为banana,但Banana, The不会被替换为Banana,。它将保持不变。

于 2013-02-07T07:13:09.213 回答
0
Collections.sort(files, new Comparator<File>() {
    @Override
    public int compare(File f1, File f2) {
        return NaturalComparator.compareNatural(collator, f1.getName().startsWith("The  ")?f1.getName().substring(4) : f1.getName(), f2.getName().startsWith("The ")?f2.getName().substring(4):f2.getName();
    }
});
于 2013-02-07T07:15:26.077 回答
0
static String ignoreThe(String s) {
    if (s.length > 3) {
        if (s.substring(0, 4).toLowerCase().equal("the ")) {
            return s.substring(0, 4);
        }
    }
    return s;
}

Collections.sort(files, new Comparator<File>() {
    @Override
    public int compare(File f1, File f2) {
        String name1 = ignoreThe(f1.getName()); 
        String name1 = ignoreThe(f2.getName()); 
        return name1.compareTo(name2);
    }
});
于 2013-02-07T07:17:11.910 回答
0

尝试

...
return NaturalComparator.compareNatural(collator, f1.getName().replaceAll("^The ", ""), f2.getName().replaceAll("^The ", ""));
于 2013-02-07T07:17:18.230 回答