在对Java集合进行排序时忽略单词“the”。

4

目前我有一些代码,可以对文件名进行不同的排序方式(基于本地环境敏感的自然排序、不区分大小写的字母表排序、按修改日期排序等)。例如,对于基于本地环境敏感的自然排序,它使用以下代码:

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

我想知道如何使程序在对文件名排序时忽略开头的单词“the”,这样排序结果将变为:

Apple
The Banana
Carrot

而不是以下这样:

Apple
Carrot
The Banana

4个回答

6
你可以在传递给比较器之前使用 String#replaceFirst(regex, replacement) 或者 String.replaceAll(regex, replacement) 方法来替换第一个出现的 The。这两种方法都需要一个 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指出这一点)。

在模式之前添加了插入符(^),这样它就只会替换字符串开头的The。因此,The banana将被替换为banana,但Banana, The将不会被替换为Banana,,它将保持不变。


抢先一步了 :) 你可能想要进行不区分大小写的替换,以捕获“the”和“The”。 - Krease
1
只有一种情况。如果字符串不以"The"开头,并且在中间出现,例如Appthe(仅为示例),使用正则表达式的ReplaceAll可能是一个好主意。 - Ajinkya
@Ajinkya.. 很好的发现。已经处理了。 - Rohit Jain
如果像“香蕉,The”这样添加了“The”,您希望出现什么行为?也许在排序之前,您想将条目规范化为该格式。所有这些都取决于您的项目目标。 - Eric Tobias
@EricTobias.. 当然,这取决于所有可能的文件名以及在排序时如何考虑每个文件名,这需要OP告知。 - Rohit Jain

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

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

0

尝试

...
return NaturalComparator.compareNatural(collator, f1.getName().replaceAll("^The ", ""), f2.getName().replaceAll("^The ", ""));

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