Java 在对键进行排序后对列表进行排序

Java 在对键进行排序后对列表进行排序,java,list,sorting,Java,List,Sorting,所以我需要一个用户的列表,但它是按费用值的降序排列的。获取值的费用方法是getValue。目前我只收取每个用户的所有费用,现在我只需要订购。我所拥有的是: public List<Expense> getListFactIndivValor() { TreeMap<String, List<Expense>> map = new TreeMap<>(); Company c = new Company(); for ( Ex

所以我需要一个用户的
列表
,但它是按费用值的降序排列的。获取值的费用方法是
getValue
。目前我只收取每个用户的所有费用,现在我只需要订购。我所拥有的是:

public List<Expense> getListFactIndivValor() {
    TreeMap<String, List<Expense>> map = new TreeMap<>();
    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 (String s : map.descendingKeySet()) {
        List<Expense> expenses = map.get(s);
        for ( Expense expense : expenses ) {
            result.add( expense);
        }
    }
    return result;
}
公共列表getListFactIndivValor(){
TreeMap map=newtreemap();
公司c=新公司();
对于(费用e:c.getExpenses()){
List expenses=map.get(如getTINUser());
如果(费用==null){
费用=新的ArrayList();
map.put(如getTINUser(),expenses);
}
费用。添加(e);
}
列表结果=新建ArrayList();
对于(字符串s:map.degendingKeyset()){
列表费用=map.get(s);
用于(费用:费用){
结果.增加(费用);
}
}
返回结果;
}
费用需要调整。然后,在返回语句之前,需要在方法的底部添加一个

Expense.sort(Comparator.comparing(Expense::getValue))


希望有帮助

您需要使用比较器对费用列表进行排序

在完成树映射的填充之后(我不确定为什么需要在这里使用树映射),您可以这样做

return map.entrySet()
           .stream()
           .flatMap(entry -> entry.getValue().stream())
           .collect(Collectors.collectingAndThen(Collectors.toList(), result -> result.stream()
                   .sorted(Comparator.comparingInt(Expense::getValue).reversed())
                    .collect(Collectors.toList())));

它对映射的条目进行流式处理并对其进行平面映射,因为该值是一个列表,并将其收集到一个列表中(就像您使用最后一个
for
循环所做的那样)。然后,它使用传递的
比较器对列表进行排序,比较器按相反的顺序(
reversed()
)对列表进行排序,并再次将结果收集到列表中。

您可以一次按两个属性对
费用进行排序,无需填充
树映射。这是一种浪费

试试这个:

public List<Expense> getListFactIndivValor() {
    List<Expense> expense = c.getExpenses();
    Collections.sort(expense, Comparator.comparing(Expense::getTinUser)
                                     .thenComparing(Expense::getValue));
    return expense;
}
公共列表getListFactIndivValor(){
列表费用=c.getExpenses();
Collections.sort(费用,Comparator.comparing(费用::getTinUser)
.然后比较(费用::getValue));
退货费用;
}

如何实施可比费用?我试图在类名后面键入ImplementComparable,但它给了我一个错误,因为Expense不是抽象的,无法覆盖方法compareTo()。如果您使用Expense类更新帖子或指向我可以找到它的位置,请耸耸肩,这并不难理解。获取Collectioning错误,然后,saying:Required:java.util.stream.Collector,java.util.function.function found:java.util.stream.Collector,java.util.List所有费用都在一个映射中,所以我仍然需要从映射中获取费用并将其传递到列表中。。。但没能做到。不管问题解决了,就是缺少了一个新的来初始化ArrayList,我的错。非常感谢。在我的函数中,您根本不需要初始化
ArrayList
。没关系,很高兴它帮了你我需要的忙,因为费用保存在地图中,所以我不能简单地执行List expense=c.getExpenses();必须在forEach中传递映射的值,并将它们添加到列表中。不管怎么说,这是最重要的:)