因此,我需要返回一个列表或一般的集合,这将给我10个在整个系统中花费最多的纳税人。这些类分为“用户”,“纳税人”(扩展到“用户”)和“费用”,在我的主类Main中,我有一个Map,其中包含“用户”和“费用”的每个值,分别是Map<String, User> usersMap<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/

10-10 10:31