忽略这个词;";对Java集合进行排序时

忽略这个词;";对Java集合进行排序时,java,sorting,collections,Java,Sorting,Collections,目前,我有一些代码采用文件名,并以不同的方式对其进行排序(区分区域设置的自然排序、不区分大小写的自然排序、按修改日期排序等),例如,对于区分区域设置的自然排序,它使用以下方法: Collections.sort(files, new Comparator<File>() { @Override public int compare(File f1, File f2) { return NaturalComparator.compareNatural(c

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

Collections.sort(files, new Comparator<File>() {
    @Override
    public int compare(File f1, File f2) {
        return NaturalComparator.compareNatural(collator, f1.getName(), f2.getName());
    }
});
Collections.sort(文件、新比较器(){
@凌驾
公共整数比较(文件f1、文件f2){
返回NaturalComparator.compareNatural(collator,f1.getName(),f2.getName());
}
});
我想知道如何使其忽略文件名开头的“the”一词,因此,不要像这样对文件排序:

苹果
胡萝卜
香蕉

命令是这样的:

苹果
香蕉

Carrot

您可以在将
的第一个匹配项传递给比较器之前,使用or方法替换
的第一个匹配项,这两种方法都将
正则表达式
作为替换参数,并且在此处都可以使用:-

@Override
public int compare(File f1, File f2) {
    return NaturalComparator.compareNatural(collator, 
                                          f1.getName().replaceAll("^(?i)The ", ""), 
                                          f2.getName().replaceAll("^(?i)The ", ""));
}  
regex模式
之前添加了一个
(?i)
标志,以进行不区分大小写的替换(感谢@Chris指出这一点)

插入符号(^)
被添加到模式之前,因此它只替换字符串开头的
。因此,
香蕉
将替换为
香蕉
,但是
香蕉
将不会替换为
香蕉,
。它将保持不变。

Collections.sort(文件,新比较器(){
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();
    }
});
@凌驾 公共整数比较(文件f1、文件f2){ 返回NaturalComparator.compareNatural(collator,f1.getName().startsWith(“The”)?f1.getName().substring(4):f1.getName(),f2.getName().startsWith(“The”)?f2.getName().substring(4):f2.getName(); } });
静态字符串忽略(字符串s){
如果(s.长度>3){
if(s.substring(0,4).toLowerCase().equal(“the”)){
返回s.substring(0,4);
}
}
返回s;
}
Collections.sort(文件、新比较器(){
@凌驾
公共整数比较(文件f1、文件f2){
字符串名称1=ignoreThe(f1.getName());
字符串名称1=ignoreThe(f2.getName());
返回name1.compareTo(name2);
}
});
试试看


先告诉我:)你可能想做一个不区分大小写的替换来捕捉“the”和“the”的思想,只需一个大小写。如果字符串不以“the”开头,并且它介于Appthe之间(仅举个例子)
ReplaceAll
使用正则表达式将是一个好主意guess@Ajinkya.. 接得好。处理好了。如果“The”像“Banana,The”那样附加了“The”,您希望采取什么样的行为?在排序之前,您可能希望将条目标准化为该格式。这完全取决于你项目的目标。@EricTobias。。当然,这取决于所有可能的文件名,以及如何在排序时考虑它们中的每一个,这是OP必须告诉的。
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);
    }
});
...
return NaturalComparator.compareNatural(collator, f1.getName().replaceAll("^The ", ""), f2.getName().replaceAll("^The ", ""));