所以我需要返回一个List或一般的Collection,它给了我在整个系统中花费最多的10个纳税人。这些课程分为用户,纳税人(扩展用户)和费用,在我的主要课程中我有一个地图,其中包含用户和费用的每个值,分别为Map<String, User> users
和Map<String, Expense> expenses
。
第一步是浏览用户地图并检查它是否是纳税人,然后纳税人获得他所做的所有费用。在每个费用中,有一个名为Value的变量,使用getValue方法返回Value。
我已经尝试过这样做,但是如果下一个纳税人的费用金额高于&#34;结束&#34;那么我在更新集合时遇到了问题。收藏品。
此外,我更愿意,如果在Java 8中没有这样做,因为我对它不太满意,而且我需要在方法中间设置更多条件
编辑(我到现在为止):
public List<Taxpayer> getTenTaxpayers(){
List<taxpayer> list = new ArrayList<Taxpayer>();
for(User u: this.users.values()){
if(!u.getUserType()){ // if it is a Taxpayer
Taxpayer t = (Taxpayer) u;
double sum = 0;
for(Expense e: this.expenses.values()){
if(t.getNIF().equals(e.getNIFClient())){ //NIF is the code that corresponds to the Taxpayer. If the expense belongs to this Taxpayer, enters the if statement.
sum += e.getValue();
if(list.size()<10){
list.add(t.clone());
}
}
}
}
}
}
答案 0 :(得分:1)
因此,如果我理解正确,当您的列表中已经有10 Taxpayers
时,您就会在如何将另一个纳税人添加到列表中以保持仅排名前10位&#34;消费者&#34 ;
解决此问题的一种方法是收集所有Taxpayers
的费用,并将所有添加到您的列表中。然后按照他们花费的金额按相反的顺序对列表进行排序。然后从列表中获取前10个条目。
您可以使用定义自己的自定义Collections.sort()
Comparator
方法执行此操作
类似的东西:
List<Taxpayer> taxpayers =...
Collections.sort(taxpayers, new Comparator<Taxpayer>()
{
@Override
public int compare(Taxpayer o1, Taxpayer o2)
{
return o1.sum - o2.sum; // using your correct total spent here
// or to just sort in reverse order
// return o2.sum - o1.sum;
}
});
如果Taxpayer
实施Comparable
,您可以使用
Collections.sort(taxpayers)
然后反转
Collections.reverse(taxpayers)
然后获得前10名
List<Taxpayer> top10 = taxpayers.subList(0, 10);
为了提高效率虽然您可以定义比较器以相反顺序对列表进行排序 - 然后您不需要反转列表 - 只需获得前10名。