在子数组列表中创建并查找最大值

Posted

技术标签:

【中文标题】在子数组列表中创建并查找最大值【英文标题】:Create and find highest value in subarraylist 【发布时间】:2022-01-03 23:36:59 【问题描述】:

我有一个 Excel 工作表中的单元格数组列表。我想从我实际拥有的单元格数组列表中创建大小为 50 的子数组列表,从索引 1590 开始,以 size()-700 结束。

我想从每个子数组列表中获取最大的数字并将其放入新的数组列表中。在新的 Arraylist 中应该只有每个 subarraylist 的最大值。

输入数据是我的单元格数组列表。

使用此代码,我得到了 50 多个数字,但它并不总是最高值。有人有想法吗?

这是我的代码:

int partitionSize = 50;

List<List<Cell>> partitions = new ArrayList<>();
List <Cell> high = new ArrayList();
Cell max = data.get(1590);

for (int i = 1590; i < data.size()-700; i += partitionSize) 
    partitions.add(data.subList(i, Math.min(i + partitionSize, data.size()-700)));


for (List<Cell> list : partitions) 
    for (int i = 1; i < list.size(); i++) 
        if (list.get(i).getNumericCellValue() > max.getNumericCellValue()) 
            max = list.get(i);
        
        high.add(max);
    

【问题讨论】:

【参考方案1】:

可以使用IntStream::iterate生成分区列表:

int start = 1590;
int end = data.size() - 700;
int size = 50;
List<List<Cell>> partitions = IntStream
    .iterate(start, i -> i < end, i -> i + size) // IntStream
    .mapToObj(i -> data.subList(i, Math.min(i + size, end)))
    .collect(Collectors.toList())
;

然后可以按如下方式检索具有最大值的单元格列表:

List<Cell> maxPerRange = partitions
    .stream() // Stream<List<Cell>>
    .map(list -> list.stream() // Stream<Cell>
                     .max(Comparator.comparing(Cell::getNumericCellValue))
                     .get()
    )
    .collect(Collectors.toList());

类似地,可以创建最大值列表,而无需将输入数据显式拆分为子列表,只需使用类似于嵌套循环的适当范围:

List<Cell> maxPerRange = IntStream
    .iterate(start, i -> i < end, i -> i + size) // IntStream
    .mapToObj(i -> IntStream.range(i, Math.min(i + size, end))
            .mapToObj(data::get)
            .max(Comparator.comparing(Cell::getNumericCellValue))
            .get()
    )
    .collect(Collectors.toList());

【讨论】:

非常感谢,这对我帮助很大。它不知道 IntStream API。我喜欢这两种解决方案,最后一个非常紧凑,第一个也很棒! 这个特定版本的IntStream/Stream::iterate方法是在Java 9中引入的【参考方案2】:

您可以利用 Stream API。

例如:

List<List<Integer>> partitions = new ArrayList<>();
List<Integer> high = partitions.stream()
    .map(partition -> partition.stream().max(Integer::compareTo))
    .filter(Optional::isPresent)
    .map(Optional::get)
    .collect(Collectors.toList());

【讨论】:

我应该做什么而不是可选我应该把类型而不是和isPresent?我的 Arraylist 的类型是 Cell 没有 compareTo 方法。 您可以将Integer::compareTo 替换为Cell 的两个实例的比较方法,但保留Optional::isPresent。抱歉,我应该考虑一下:Java 对您来说是新事物吗? 是的,这对我来说是新的,对你的评论 uo p 对我有很大帮助,但感谢你的建议 :) @Nando94 抱歉,我对您的最后评论感到困惑。我的解决方案对您有用还是您需要更多帮助?

以上是关于在子数组列表中创建并查找最大值的主要内容,如果未能解决你的问题,请参考以下文章

使用java编写两个方法min和max在链表中查找最大值和最小值,但输入列表是整数数组

查找列表中的最大绝对值

Python查找列表中最大值的索引

Windows批处理脚本在子文件夹中查找最大的PDF文件并使用Ghostscript和`pdftk`在页脚中打印路径

C语言丨如何查找数组(序列)中的最大值或者最小值?

在用户定义的列表中查找具有最大字符数的类对象的项目