【问题标题】:Class to store multiple comparators存储多个比较器的类
【发布时间】:2015-01-05 17:31:33
【问题描述】:

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

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

我认为将所有这些比较器放在同一个类中或作为 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> {
        ...
    }
}

我知道如何运行它,但我似乎无法找到一种方法来创建新的内部类而不先创建外部类。在我看来,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;
        }
    ...
    }

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

非常感谢!

【问题讨论】:

  • “我认为将所有这些比较器放在同一个类中或作为 lambda 表达式会很麻烦” - 这有什么麻烦? lambda 路由似乎是最好的选择,尤其是如果您使用方法引用。
  • 代码片段用于可运行的网络语言示例。请改用代码示例{ } 按钮。
  • 我认为这对代码的可重用性会更好,并且在最后添加一堆类或方法对我来说感觉很乱,因为它们显然已经被说服并执行类似的任务,而只是添加到 end 不会'看起来不太好,但那可能只是我

标签: java class sorting nested comparator


【解决方案1】:

您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-07
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多