实现EvenIterator获取字符串集合偶数索引元素报错如何解决
错误原因
- 语法错误:
value是String类型,Java不支持字符串与整数做模运算,因此触发参数类型不匹配的编译报错 - 逻辑错误:你的需求是筛选偶数索引位置的元素,而非筛选值为偶数的元素,现有判断逻辑不符合需求
修复原有实现的方案
只需要修改createEvenListIterator方法,新增索引计数器来判断位置即可:
private void createEvenListIterator() { LinkedList<String> list = new LinkedList<>(); int index = 0; // 新增索引计数器,从0开始计数 while(iter.hasNext()) { String value = iter.next(); if(index % 2 == 0) { // 判断索引是否为偶数,而非判断元素值 list.add(value); } index++; } iter = list.iterator(); }
注意需要提前导入依赖类:java.util.LinkedList、java.util.Iterator、java.util.NoSuchElementException。
更优的懒加载实现方案(推荐)
原有实现需要提前遍历整个集合、缓存所有符合条件的元素,大集合场景下会额外占用内存。你可以改用懒迭代的实现方式,遍历时实时判断索引,无需提前加载全量数据:
import java.util.Iterator; import java.util.NoSuchElementException; public class EvenIterator implements Iterator<String> { private final Iterator<String> originalIter; private int currentIndex = 0; private String nextEvenElement; public EvenIterator(Iterable<String> iterable) { this.originalIter = iterable.iterator(); prefetchNextEven(); } // 预取下一个偶数索引的元素 private void prefetchNextEven() { nextEvenElement = null; while (originalIter.hasNext()) { String current = originalIter.next(); if (currentIndex % 2 == 0) { nextEvenElement = current; currentIndex++; break; } currentIndex++; } } @Override public boolean hasNext() { return nextEvenElement != null; } @Override public String next() { if (nextEvenElement == null) { throw new NoSuchElementException(); } String result = nextEvenElement; prefetchNextEven(); return result; } @Override public void remove() { throw new UnsupportedOperationException(); } }
补充说明
如果你的业务中索引是从1开始计数,需要取第2、4、6位的元素,只需要把索引判断条件改为index % 2 == 1即可。
内容的提问来源于stack exchange,提问作者Carlo Viloria
相关产品推荐
相关产品推荐

