【问题标题】:How to sort object using a multi map?如何使用多图对对象进行排序?
【发布时间】:2014-09-24 10:29:58
【问题描述】:

您好,我正在尝试根据该对象的值对该对象进行排序。最初我使用 TreeMap 进行排序,但有一些非唯一键被删除,因此不起作用。我搜索了一下,发现了 Guava MultiMap。但是我如何实际使用它来对值进行排序?

基本上,我正在尝试根据 diffYTD_percentage 值对预算信息进行排序。谢谢!

Multimap<Double, BudgetInformation> multiMap = ArrayListMultimap.create();
    for (Budget budget : budgets) {
        BudgetInformation budgetInfo = getBudget(budget.getId());
        double actualToDate = budgetInfo.getActualToDate();
        double budgetToDate = budgetInfo.getTotalBudgetToDate();
        double diffYTD_value = budgetToDate - actualToDate;
        double diffYTD_percentage_value = 0.0;
        if (budgetToDate != 0.0) {
            double fraction = actualToDate / budgetToDate;
            fraction = fraction - 1;
            diffYTD_percentage_value = fraction * 100;
        }
        multiMap.put(diffYTD_percentage_value, budgetInfo);
    }

    Iterator<BudgetInformation> budgetIterator = multiMap.values().iterator();

【问题讨论】:

    标签: java sorting map guava multimap


    【解决方案1】:

    使用树对集合进行排序是错误的方法。在 Java 中,有专门的实用方法来对列表进行排序,Collections.sort(List&lt;T extends Comparable&lt;? super T&gt;&gt; list)Collections.sort(List&lt;T&gt; list, Comparator&lt;? super T&gt; c)。第一个用于对元素具有自然排序的列表进行排序(基本实现Comparable 接口),后者用于像您自己的情况,当您需要使用自定义排序对元素进行排序时。

    所以,基本上您需要做的是创建Comparator,它将基于diffYTD_percentage_value 比较两个BusinessInfo 实例,并使用此比较器调用Collections.sort

        Comparator<BudgetInformation> budgetInfoCmp = new Comparator<BudgetInformation>() {
            private double getDiffYTDPercentage(BudgetInformation budgetInfo) {
                double actualToDate = budgetInfo.getActualToDate();
                double budgetToDate = budgetInfo.getTotalBudgetToDate();
                double diffYTDValue = budgetToDate - actualToDate;
                double diffYTDPercentageValue = 0.0;
                if (budgetToDate != 0.0) {
                    double fraction = actualToDate / budgetToDate;
                    fraction = fraction - 1;
                    diffYTDPercentageValue = fraction * 100;
                }
                return diffYTDPercentageValue;
            }
    
            @Override
            public int compare(BudgetInformation o1, BudgetInformation o2) {
                return Double.compare(getDiffYTDPercentage(o1), getDiffYTDPercentage(o2));
            }
        };
    
        List<BudgetInformation> budgetInformationsToSort = getBudgetInformations();
        Collections.sort(budgetInformationsToSort, budgetInfoCmp);
    

    同时尽量避免在变量命名中使用下划线,因为under Java naming convention变量名应该是驼峰式的。

    【讨论】:

      【解决方案2】:

      使用TreeMultiMap怎么样?它不支持重复的键值对。但是重复键没问题。

      【讨论】:

      • 它不允许我将类 BudgetInformation 放入 TreeMultiMap。 TreeMultiMap 不起作用。
      • 如果你打开那个链接,你会发现它写着Class TreeMultimap&lt;K,V&gt; 键和值是泛型的。它可以是双倍的,长的等等。
      • 那么我该如何使用它来对 BudgetInformation 进行排序?
      • 使用您在代码 sn-p 中使用的相同 put 语句。它将在内部通过键对其进行排序。
      • 但是我在 TreeMultimap 中放了什么
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2011-12-23
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多