Class 存储多个比较器

Class to store multiple comparators

我有一个任务是根据用户输入的名称、大小、修改日期、大小、类型和其他类型的条件对文件(文件列表)进行排序。

因此,如果用户输入 "dir /sort=esdn"(扩展名、大小、日期、名称) 这意味着按扩展排序,程序无法决定按大小排序...

我认为将所有这些比较器放在相同的 class 或作为 lambda 表达式会很混乱,所以我想创建一个新的类,其中所有比较代码都是

public class Comparisons {

    public class Ext implements Comparator<File> {
        ...
    }

    public class Size implements Comparator<File> {
        ...
    }

    public class Date implements Comparator<File> {
        ...
    }

    public class Name implements Comparator<File> {
        ...
    }

    public class Type implements Comparator<File> {
        ...
    }
}

我知道如何运行它,但我似乎无法找到一种方法来创建新的内部 class,而不先创建外部 class。在我看来 Java 会有类似的东西,因为它非常注重语法糖,最好的选择是新包。

其余代码将是按首字母排序的递归函数

private boolean sort(String substring, List<File> fin) {
        Comparator<File> k = null;

        char in = substring.toLowerCase().charAt(0);

        switch (in) {
        case n:
            k = Comparisons.new Name();
            break;
        case e:
            k = Comparisons.new Ext();
            break;
        case s:
            k = Comparisons.new Size();
            break;
        case d:
            k = Comparisons.new Date();
            break;
        case t:
            k = Comparisons.new Type();
            break;
        default:
            break;
        }
    ...
    }

我知道这行不通,但这是我想要实现的总体思路。

非常感谢!

您可以使用 enum:

public enum FileComparator implements Comparator<File> {
    DateComparator {

        @Override
        public int compare(File o1, File o2) {
            // TODO Auto-generated method stub
            return 0;
        }

    },
    SizeComparator {

        @Override
        public int compare(File o1, File o2) {
            // TODO Auto-generated method stub
            return 0;
        }

    },

    NameComparator {
        @Override
        public int compare(File o1, File o2) {
            // TODO Auto-generated method stub
            return 0;
        }
    }
}

enum 中的每个元素都可以有自己版本的 compare 方法,您不需要创建任何 classes,但您仍然可以像这样使用它正常 class:

Comparator<File> comp = FileComparator.NameComparator;
//use the comparator