因此,我需要返回一个列表或一般的集合,这将给我10个在整个系统中花费最多的纳税人。这些类分为“用户”,“纳税人”(扩展到“用户”)和“费用”,在我的主类Main中,我有一个Map,其中包含“用户”和“费用”的每个值,分别是Map<String, User> users
和Map<String, Expense> expenses
。
第一步是浏览用户地图,检查它是否是纳税人,然后为该纳税人获取他已完成的所有费用。每个费用中都有一个名为Value的变量,该变量带有getValue方法以返回Value。
我已经尝试过了,但是如果下一个纳税人的费用金额总和比“结束”时的费用更高,我在更新集合时就会遇到问题。
另外,我更喜欢如果不是在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());
}
}
}
}
}
}
最佳答案
因此,如果我的理解正确,那么当您的列表中已经有10个Taxpayers
时,您就在努力如何将另一个纳税人添加到列表中,以维持仅前10名“支出者”
解决此问题的一种方法是收集所有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)
然后进入前十
List<Taxpayer> top10 = taxpayers.subList(0, 10);
为了提高效率,尽管您可以定义比较器以按相反的顺序对列表进行排序-则无需反转列表-只需获得前10名即可。
关于java - 花费最多的10位纳税人名单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50499287/