【问题标题】:How can I sort a list of Java objects based on parameters that a user selects from a drop down menu?如何根据用户从下拉菜单中选择的参数对 Java 对象列表进行排序?
【发布时间】:2019-05-11 11:02:05
【问题描述】:

我了解如何为基于这些对象的多个属性的对象列表构建和使用Comparator。但是,我不确定如何通过让用户选择要排序的参数来有效地做到这一点。这是GWT 用户界面。

例如,我有两个下拉菜单,每个下拉菜单有 11 个参数,对应于对象的属性。每个菜单旁边也有一个按钮来指定升序/降序。

因此,用户可以选择例如按fileName, desctimestamp, asc 排序。我如何对这些对象进行排序,而无需针对数百种可能的组合使用冗长的 if 语句?

如果排序是固定的,我可以这样做:

files.sort(Comparator.comparing(FileInfo::getFileName).thenComparing(FileInfo::getTimestamp).reversed());

(我可能已经把 asc/desc 倒退了)
但我不应该为每一个可以想象的选项都输入它。那么我该怎么做呢?

【问题讨论】:

  • 你在用弹簧吗?
  • 这可能会给你一些想法/帮助你开始 --> stackoverflow.com/questions/1421322/…
  • @Mykhailo 不幸的是,Java EE 和 GWT 不适合这个应用程序
  • @Aomine 谢谢!我会检查一下。
  • 您可以为此目的使用策略模式

标签: java sorting gwt java-8 comparator


【解决方案1】:

您可以尝试创建一个枚举:

public enum FileInfoComparator {
    FILE_NAME(Comparator.comparing(FileInfo::getFileName)),
    TIMESTAMP(Comparator.comparing(FileInfo::getTimestamp)),
    SIZE(Comparator.comparing(FileInfo::getSize)),
    // ... add other criteria here
    ;

    private final Comparator<FileInfo> comparator;

    FileInfoComparator(Comparator<FileInfo> comparator) {
        this.comparator = comparator;
    }

    static Comparator<FileInfo> by(String key, boolean ascending) {
        Comparator<FileInfo> comparator = valueOf(key).comparator;
        return ascending ? comparator : comparator.reversed();
    }

    static Comparator<FileInfo> by(Pair<String, Boolean> criterion) {
        return by(criterion.getKey(), criterion.getValue());
    }

    static Optional<Comparator<FileInfo>> by(List<Pair<String, Boolean>> criteria) {
        return criteria.stream()
                .map(FileInfoComparator::by)
                .filter(Objects::nonNull)
                .reduce(Comparator::thenComparing);
    }

}

然后使用:

// Create the list of selected criteria based on user input:
// E.g. [FILE_NAME, false] will mean "sort by fileName descending"
List<Pair<String, Boolean>> selectedCriteria = ...

// Build your comparator and sort your list
FileInfoComparator.by(selectedCriteria).ifPresent(files::sort);

如果用户选择为空,files 将保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2012-02-08
    • 2018-07-18
    • 2018-01-29
    • 2017-04-09
    相关资源
    最近更新 更多