如何在ArrayList的指定索引范围内获取最大值或最小值?
获取ArrayList指定索引范围的最大/最小值
嘿,这个需求其实很好解决!既然你已经熟悉用Collections.max(list)和Collections.min(list)获取整个列表的极值,那只要先提取出目标索引范围内的子列表,再用这两个方法就搞定啦。
方法一:利用subList方法
ArrayList自带的subList(int fromIndex, int toIndex)方法可以帮你快速获取指定范围的子列表——注意这里的fromIndex是包含的,toIndex是排他的。比如你要获取索引0到5(包含这两个索引)的元素,那fromIndex传0,toIndex就得传6(因为要包含索引5的元素)。
举个具体的代码例子:
import java.util.ArrayList; import java.util.Collections; import java.util.Arrays; public class RangeExtremes { public static void main(String[] args) { // 初始化测试列表 ArrayList<Integer> numList = new ArrayList<>(Arrays.asList(10, 2, 15, 7, 22, 5, 30, 1)); // 定义范围:索引0到5(包含) int startIdx = 0; int endIdx = 5; // 注意:subList的结束参数是endIdx + 1,因为它是排他的 var subList = numList.subList(startIdx, endIdx + 1); // 求极值 int rangeMax = Collections.max(subList); int rangeMin = Collections.min(subList); System.out.printf("索引%d到%d的最大值:%d%n", startIdx, endIdx, rangeMax); // 输出22 System.out.printf("索引%d到%d的最小值:%d%n", startIdx, endIdx, rangeMin); // 输出2 } }
⚠️ 要注意的细节:
subList返回的是原列表的视图,不是新列表,所以如果原列表后续被修改,子列表也会跟着变;如果不需要关联,可以把它转成新的ArrayList:new ArrayList<>(numList.subList(...))- 必须保证
startIdx >= 0、endIdx < numList.size()、startIdx <= endIdx,否则会抛出IndexOutOfBoundsException - 如果范围里没有元素(比如
startIdx > endIdx),调用Collections.max/min会抛出NoSuchElementException,记得做判空处理
方法二:Java 8+ 流操作
如果你习惯用流的写法,也可以通过skip和limit来截取范围,然后调用max/min方法:
import java.util.ArrayList; import java.util.Arrays; import java.util.Optional; public class RangeExtremesWithStream { public static void main(String[] args) { ArrayList<Integer> numList = new ArrayList<>(Arrays.asList(10, 2, 15, 7, 22, 5, 30, 1)); int startIdx = 0; int endIdx = 5; int rangeLength = endIdx - startIdx + 1; // 获取最大值 Optional<Integer> maxOpt = numList.stream() .skip(startIdx) .limit(rangeLength) .max(Integer::compareTo); // 获取最小值 Optional<Integer> minOpt = numList.stream() .skip(startIdx) .limit(rangeLength) .min(Integer::compareTo); // 安全取值(避免空指针) int rangeMax = maxOpt.orElseThrow(() -> new IllegalStateException("指定范围无元素")); int rangeMin = minOpt.orElseThrow(() -> new IllegalStateException("指定范围无元素")); System.out.printf("索引%d到%d的最大值:%d%n", startIdx, endIdx, rangeMax); System.out.printf("索引%d到%d的最小值:%d%n", startIdx, endIdx, rangeMin); } }
这种写法更灵活,而且通过Optional可以优雅地处理空范围的情况。
内容的提问来源于stack exchange,提问作者Pedro Martins
相关产品推荐
相关产品推荐

