用于存储多个比较器的类

时间:2015-01-05 17:31:34

标签: java class sorting nested comparator

我有一个任务来排序文件(文件列表),依赖于用户输入的名称,大小,修改日期,大小,类型以及将来可以添加的其他类型的条件。

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

我认为将所有这些比较器放在同一个类或lambda表达式中会很麻烦,所以我想创建一个所有比较代码都是

的新clas
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> {
        ...
    }
}

我知道如何运行它以及所有,但我似乎无法找到一种方法来创建新的内部类而不首先创建外部类。在我看来,Java会有类似的东西,因为它对sytax糖有很大的影响,最好的改变是新包装。

其余的代码是递归函数,按第一个字母排序

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

我知道这不起作用,但这是我想要实现的一般想法。

非常感谢!

1 个答案:

答案 0 :(得分:3)

您可以使用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方法版本,但您不需要创建任何类,但仍然可以像普通类一样使用它:

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