Java中如何从指定起始索引查找ArrayList的元素索引?
在ArrayList中从指定起始位置查找元素索引的正确方法
你当前的问题出在subList的特性上:bricks.subList(1, bricks.size())返回的是原列表的视图,这个子列表的索引是从0重新开始计数的,所以子列表里"CCCC"的索引是0,但它对应原列表的索引1。直接输出子列表的索引自然得不到你想要的原列表索引。
解决方案1:基于subList计算原索引
找到子列表中的索引后,加上起始偏移量(也就是你指定的搜索起始位置)即可,注意要处理找不到元素返回-1的情况:
import java.util.*; public class Test{ public static void main(String[] args) { ArrayList<String> bricks = new ArrayList<>(List.of("BBBB","CCCC","DDDD")); int startSearchIndex = 1; String target = "CCCC"; // 获取子列表中目标元素的索引 int subListIndex = bricks.subList(startSearchIndex, bricks.size()).indexOf(target); // 转换为原列表的索引,找不到则返回-1 int originalIndex = subListIndex != -1 ? subListIndex + startSearchIndex : -1; System.out.println(originalIndex); // 输出1 } }
解决方案2:直接循环遍历(更直观,无视图依赖)
从指定起始位置开始遍历原列表,找到第一个匹配的元素后返回其索引:
import java.util.*; public class Test{ public static void main(String[] args) { ArrayList<String> bricks = new ArrayList<>(List.of("BBBB","CCCC","DDDD")); int startSearchIndex = 1; String target = "CCCC"; int originalIndex = -1; for (int i = startSearchIndex; i < bricks.size(); i++) { if (target.equals(bricks.get(i))) { originalIndex = i; break; // 找到第一个匹配项就退出循环 } } System.out.println(originalIndex); // 输出1 } }
解决方案3:用Stream API(Java 8+)
通过IntStream遍历指定范围的索引,过滤出匹配元素的索引:
import java.util.*; import java.util.stream.IntStream; public class Test{ public static void main(String[] args) { ArrayList<String> bricks = new ArrayList<>(List.of("BBBB","CCCC","DDDD")); int startSearchIndex = 1; String target = "CCCC"; int originalIndex = IntStream.range(startSearchIndex, bricks.size()) .filter(i -> target.equals(bricks.get(i))) .findFirst() .orElse(-1); System.out.println(originalIndex); // 输出1 } }
这个方法在列表有重复元素时也能准确找到起始位置后的第一个匹配项,不会受前面重复元素影响。
内容的提问来源于stack exchange,提问作者Ser
相关产品推荐
相关产品推荐

