有没有什么有效的方法可以找到 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/