java - 对 Java 集合进行排序时忽略单词 "the"

标签 java sorting collections

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

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

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

苹果
胡萝卜
香蕉

它这样命令它们:

苹果
香蕉
胡萝卜

最佳答案

在将 The 传递给比较器之前,您可以使用 String#replaceFirst(regex, replacement) 替换第一次出现的 TheString.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 ", ""));
}  

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

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

关于java - 对 Java 集合进行排序时忽略单词 "the",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14745583/

相关文章:

Java 8 : Interface with static methods instead of static util class

java - Hibernate Session.multiLoad L2 缓存问题

java - "Crypting"Java练习

objective-c - 如何仅从核心数据中获取前 20 个对象

java - 如何按用户编号对用户的 ArrayList 进行排序

java - 在不使用 contains() 方法的情况下添加到集合的单元测试

Java Map,其中值是与键类型相同的值列表

java - 将扫描图像的内容流式传输到 Java 文件

java - 为什么我不能通过简单地排序序列来解决最长递增子序列?

java - Java 中的表可以使用什么数据结构?