java - Java中ArrayList中最大值的位置

标签 java arraylist

有没有什么有效的方法可以找到 ArrayList 中最大值的位置?我已经编写了以下代码,想知道是否可以使下面代码中的第 2 行更有效率。

static int getPatternCount(ArrayList<Integer> indicesInPool, int indexofEndStr) {
        int position = indicesInPool.indexOf(Collections.max(indicesInPool));
        return (Math.abs(indexofEndStr - indicesInPool.get(position)) + 1);
    }

最佳答案

第二行将最终迭代列表两次。

您可以通过(手动)编写一个循环来查找最大值并跟踪它出现的位置,从而获得更好的性能。

ArrayList<Integer> list = ...
int limit = list.size();
int max = Integer.MIN_VALUE;
int maxPos = -1;
for (int i = 0; i < limit; i++) {
    int value = list.get(i);
    if (value > max) {
        max = value;
        maxPos = i;
    }
}
// maxpos now contains the (first) index of the largest value ...
// ... or -1 if the list is empty.

可能有第 3 方库将此作为库方法提供。


我不认为有一种更快的方法可以用一个线程来完成这项工作。如果列表真的很大,使用多个线程扫描列表的不同部分可能会给您带来更好的性能。但是,您会遇到同步和设置的复杂性/开销。并且实际性能很可能会受到硬件内存系统的限制;即缓存大小和内存带宽。


根据列表的使用方式,您可以通过其他方式更有效地跟踪最大值及其位置。

  • 如果您只在列表末尾添加元素,从不更新或删除元素,那么您可以在每次append 和元素添加到列表中。

  • 在更一般的情况下,可能可以设计和实现专门的自定义列表类型,以在面对任何类型的更新时跟踪最大和最大位置。但是数据结构会很复杂并且需要大量内存,像 get 这样的操作会从 O(1)O(logN) 或者更糟.

关于java - Java中ArrayList中最大值的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25588274/

相关文章:

java - 在硬件上强制执行的变量范围

java - 当 ArrayList 频繁更改时,访问特定的 ArrayList 元素

java - 将元素添加到 ArrayList 的正确位置

Java.数组列表。方法删除()

Java HashMap 问题。

javascript - 如何使用JavaScript将文件作为多部分文件上传到后端?

java - 如何从已编译的 Java 类/jar 文件中删除方法?

java - 使用 ColorConverterOp Java 将 RGB JPEG 转换为 CMYK JPEG

java - 查询 OpenTTD 服务器

java - 将数据从后端的 ArrayList 传递到 JComboBox GUI 前端 - Java Swing