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

SortedMap,其中键是一个属性,值是具有相同键的n个最低值的降序列表

咸昀
2023-03-14

我正在使用一个CSV文件,其中包含一些有关事故的信息。现在我已经创建了事故类型:

private Integer driverAge;
private Integer vehicleAge;

public Accident(Integer driverAge, Integer vehicleAge) {
this.driverAge = driverAge;
this.vehicleAge = vehicleAge;
}

我还创建了一个函数,可以读取所有csv文件,将所有事故转换为列表

private List<Accident> accidents;

public AccidentArchive(List<Accident> accidents) {
this.accidents = accidents;
}

因此,我们正在处理我还不完全理解的流,我一直在做这个练习,我必须创建一个返回SortedMap的函数

public SortedMap<Integer, List<Integer>> getNMinVehicleAgesPerDriverAge(Integer n) {
return getAccidents().stream().
...

我试过使用收集器。toMap()和收集器。toList()以某种方式使其工作,但我不知道如何做。我已经搜索了一段时间,但我没有找到任何与我的情况类似的东西,在任何文档页面中也找不到任何有用的东西。

共有1个答案

时恩
2023-03-14

您可以使用groupingBy()的风格,它需要三个参数:分类器函数、供应商mapFactory(允许指定生成的map类型)和下游收集器。

作为groupingBy()的下游收集器,您可以使用映射()和自定义收集器的组合,它们只保留与每个驾驶率相关的最低车辆里程值:

public SortedMap<Integer, List<Integer>> getNMinVehicleAgesPerDriverAge(Integer n) {
    return getAccidents().stream()
        .collect(Collectors.groupingBy(Accident::getDriverAge,
            TreeMap::new,
            Collectors.mapping(Accident::getVehicleAge, 
                getMaxN(n, Comparator.<Integer>reverseOrder()))));
}

下面提供的方法负责根据所提供的结果列表的最大大小和比较器生成自定义收集器。答案中详细解释了其背后的逻辑:

public static <T> Collector<T, ?, List<T>> getMaxN(int size, Comparator<T> comparator) {
        
    return Collector.of(
        () -> new PriorityQueue<>(comparator),
        (Queue<T> queue, T next) -> tryAdd(queue, next, comparator, size),
        (Queue<T> left, Queue<T> right) -> {
            right.forEach(next -> tryAdd(left, next, comparator, size));
            return left;
        },
        (Queue<T> queue) -> queue.stream().toList(),
        Collector.Characteristics.UNORDERED);
}
    
public static <T> void tryAdd(Queue<T> queue, T next, Comparator<T> comparator, int size) {
    if (queue.size() == size && comparator.compare(next, queue.element()) < 0) queue.remove(); // if next value is less than the smallest element in the queue and max size has been exceeded the largest element needs to be removed from the queue
    if (queue.size() < size) queue.add(next);
}

顺便说一句,如果您的作业没有指定使用SortedMap作为返回类型的要求。最好使用NavigableMap接口,它定义了更广泛的方法。

 类似资料:
  • 我正在使用一个CSV文件,其中包含一些有关事故的信息。 我创建了事故类型: 我还创建了一个函数,可以读取所有CSV文件,将所有事故转换为列表 因此,我们正在处理我还不完全理解的流,我一直在做这个练习,我必须生成一个返回排序映射的函数 我尝试使用和以某种方式使其工作,但我不知道如何做到这一点。

  • 问题内容: 对于我的程序,我想从属性文件中读取一个键,并从该键关联的值列表中读取。 最近我在尝试那样 我的属性文件如下所示- 我想要键A应该有一个包含contains 和B包含的列表。 因此Map应该是这样,但是我 在网上搜索了这种方法,但一无所获。我希望有办法。有什么帮助吗? 问题答案: 尝试将属性编写为以逗号分隔的列表,然后在加载属性文件后拆分值。例如 如果您在值中使用逗号,则还可以使用org

  • 我今天面试了,我的面试官问我如何在HashMap中存储具有相同键的多个值?她给了我这个例子—— 我在如何使用HashMap时给了她以下解决方案: 整数是字符串的长度,ArrayList将存储该特定长度的字符串。 面试官说这是使用HashMap的一种方式,但还有另一种方式我不需要ArrayList或任何其他数据结构。在面试期间,我无法想出任何解决方案,现在在谷歌搜索了足够多之后,我仍然一无所获。有人

  • 这与我想要的不同,因为它是作为JSON的每个单独行的数组。我想要一个json(不是数组),其中列是键,数组是值。我怎么能那么做?

  • 问题内容: 如果我想找出两个键中是否没有一个键与另一个键不同,并且该键的值彼此匹配,如何最好地比较两个键。 将A与B进行比较时,由于B和D键的不同,它应该会失败。 如何最好地比较未排序的哈希图? 问题答案: 做一个支票上两者秒。 注意: 如果您包含键,那没有问题,但是如果您的Map包含类型键,则需要确保您的类实现了。