当前位置: 首页 > 知识库问答 >
问题:

排序使用overriden方法比较[重复]

艾星河
2023-03-14

我试图按价格对项目进行排序,但每个项目都属于一个类别,因此我必须创建一个以类别为键、以项目为值的地图,并且我必须使用Comparatorclass对其进行排序。

这是比较器类

public class ProductionSorter implements Comparator<Item> {
    public ProductionSorter(){};

    @Override
    public int compare (Item a, Item b){
        return a.getSellingPrice().compareTo(b.getSellingPrice());
    }
}

这就是地图

Map <Category, List<Item>> mapOfItems = items
                .stream()
                .collect(Collectors.groupingBy(Item::getCategory));

我不知道如何在这张地图上按价格对物品进行分类。

共有1个答案

濮泳
2023-03-14

下面应该可以做到这一点:

Map<String, List<Item>> mapOfItems = items.stream()
        .collect(Collectors.groupingBy(Item::getCategory,
                collectingAndThen(toList(), e -> e.stream().sorted(new ProductionSorter()).collect(toList()))));

具有以下导入:

import java.util.*;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.*;

它与您已经拥有的类似,但有额外的Collector,以便您可以定义您希望如何收集数据

您可以在参考文档中阅读有关收集和然后()的更多信息。

 类似资料:
  • 可能重复:< br >使用多个键对Java对象排序 我找不到任何使用此方法的示例,所有示例都给出了第二个参数“null”。我听说这个方法用于根据一个以上的标准对类进行排序,但没有找到任何示例。 } 如果我想根据学生的名字对学生列表进行排序

  • 我的列表中有这样一个< code>compareTo代码: 当我使用时,我得到以下错误: 当我将其更改为<code>if(this.long1 现在,重复确实发生了,需要正确排序。重复项是出现在第一个还是最后一个并不重要,只要它们按顺序正确分组,如下所示: 我该如何正确地做到这一点?谢谢你。 更新 该列表仍在按以下所有建议排序。这是因为它是一个

  • 谁能解释一下为什么下面的代码不起作用: 但这一个有效: 换句话说,与创建普通类实例相比,接口实现何时是可互换的?当我使用compareTo()方法时会出现错误,该方法是Comparable接口的一部分,由所有包装类(如整数)实现。 所以我猜

  • 我是一名自学型开发人员,现在正在学习Java。我了解到,要对函数接口使用方法引用,我们引用的方法的签名必须与该函数接口内抽象方法的签名匹配。 但是在学习比较器时,发现“Comparator.comparing()”方法接受函数接口并返回一个比较器。我知道函数接口的抽象方法必须接受一个参数并返回一个值。 但是我可以将任何部分(而不是完全)匹配Function接口签名的方法(作为方法参考)传递给比较器

  • 我是Java新手,我正在尝试使用Lambda表达式和比较器。我有一个具有其他getter和toString方法的公共类人员: 现在我想对一个Person[]列表进行排序,首先按String(降序)进行比较,然后按年龄(升序)进行比较,然后按计算机数量(降序)进行比较,最后按Salary(升序)进行比较。我无法实现可比较,因为如果我重写compareTo方法,它应该是升序或降序,我需要两者。我想知道

  • 所以我正在使用一些预先存在的比较器,它们比较两个元组中的某些值,如果第一个大于第二个,则返回true,否则返回false。这是其中之一的代码: 现在,我有一个字典,里面有许多上面比较的类型的元组条目。我想以相反的顺序对它们进行排序,但我真的不知道如何完成。我在想这样的事情: 但是我不知道向比较器传递什么,因为每个比较器都有两个参数(subInfo1、subInfo2)。我不能更改比较器函数。