如何使用多地图对对象进行排序?

时间:2014-09-24 10:29:59

标签: java sorting map guava multimap

您好我尝试根据该对象的值对对象进行排序。最初我使用的TreeMap进行了排序,但是有一些非唯一的键被删除了,因此无法正常工作。我用Google搜索并遇到了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();

2 个答案:

答案 0 :(得分:2)

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

因此,基本上您需要做的是创建Comparator,它将比较基于BusinessInfo的两个diffYTD_percentage_value实例,并使用此比较器调用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变量名应该是驼峰式的。

答案 1 :(得分:0)

如何使用TreeMultiMap?它不支持重复的键值对。但是复制键很好。