您好我尝试根据该对象的值对对象进行排序。最初我使用的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();
答案 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?它不支持重复的键值对。但是复制键很好。