花费最多的10名纳税人名单

时间:2018-05-24 00:36:13

标签: java

所以我需要返回一个List或一般的Collection,它给了我在整个系统中花费最多的10个纳税人。这些课程分为用户,纳税人(扩展用户)和费用,在我的主要课程中我有一个地图,其中包含用户和费用的每个值,分别为Map<String, User> usersMap<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());
                      }
                    }
                }
        }
    }
}

1 个答案:

答案 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名。