Java 按用户获取已排序的列表

Java 按用户获取已排序的列表,java,Java,我需要得到一个按费用递减值排序的列表,但要按纳税人排序。假设1号纳税人有3项费用,2号纳税人有2项费用,我需要从第一个纳税人那里得到费用并对其进行排序,然后对2号纳税人的费用进行排序。到目前为止,我得到的是: public TreeSet<Expense> getListFactIndivValor(){ TreeSet<Expense> t = new TreeSet<Expense>(new ComparatorValue(-1)); //-1 b

我需要得到一个按费用递减值排序的列表,但要按纳税人排序。假设1号纳税人有3项费用,2号纳税人有2项费用,我需要从第一个纳税人那里得到费用并对其进行排序,然后对2号纳税人的费用进行排序。到目前为止,我得到的是:

 public TreeSet<Expense> getListFactIndivValor(){
   TreeSet<Expense> t = new TreeSet<Expense>(new ComparatorValue(-1)); //-1 because I had to use this comparator to do ascending order on another method
   Company c = (Company) this.users.get(userId); //Entity that issues expenses. has the method getExpenses. Gets the Company logged in.
   for(User u: this.users.values()){ //this.users has all the users on the system
       if(!u.getUserType()){ // If user is Taxpayer
           for(Expense e: c.getExpenses().values()){ //gets all the expenses of the Company.
             if(u.getTIN().equals(e.getTINUser())){ //if the user TIN is the same that the one on expense
                  t.add(e.clone());
             }
           }
       }
   }
   return t; 
}

我认为他会像我所希望的那样对每个纳税人进行检查,但只是按价值排序,没有考虑到我需要每个纳税人都进行检查。

一个集合树集合并不是为了有一个特定的顺序而设计的。而是使用ArrayList作为方法的结果

您必须执行两个步骤:

使用可排序的树状图对所属用户的费用进行排序 迭代排序的用户并提取her费用

public List<Expense> getListFactIndivValor()
{
    Comparator<TINUser> comparator = TINUser::compareTo;
    TreeMap<TINUser, List<Expense>> map = new TreeMap<>( comparator);
    Company c = new Company();
    for ( Expense e : c.getExpenses() )
    { 
        List<Expense> expenses = map.get( e.getTINUser());
        if ( expenses == null )
        {
            expenses = new ArrayList<>();
            map.put( e.getTINUser(), expenses);
        }
        expenses.add( e);
    }

    List<Expense> result = new ArrayList<>();
    for ( TINUser u : map.descendingKeySet() )
    {
        List<Expense> expenses = map.get( u);

        for ( Expense expense : expenses )
        {
            result.add( expense);
        }
    }

    return result;
}

在TINUser类中实现一个compareTo方法,该方法定义排序标准。

什么是f?为什么每次都要重复使用相同的c公司费用?你的问题不清楚应该是e,已经解决了。第二个问题我不明白。TINUser变量在类费用中。我需要在那里实现比较?而且我的Tinuer只是一个字符串,我应该为TreeMap回复TreeMap吗?是的。由于您没有提供足够的详细信息,我只是猜测了您的数据类型。如果它是一个字符串,它已经是一个可比较的,您不需要将比较器传递给树映射,因为它按照自然顺序排序。实际上,它仍然缺少比较每个费用的部分。我需要按降序值对列表进行排序。我应该将列表更改为树集并使用比较器对其进行排序吗?使用ArrayList并使用比较器对其进行排序