为什么ListIterator.previousIndex()返回单元素整型数组而非int值?
问题根源
你遇到的所有异常都不是ListIterator.previousIndex()的返回值问题,Java官方文档描述正确,该方法确实返回int类型,问题出在代码逻辑错误和Java List方法重载的特性上:
- 你贴出的代码缺失外层
bucketIterator循环的闭合右括号,会导致循环逻辑不符合预期,出现多余的嵌套列表插入操作,也就是你调试看到的3层结构问题 - Java的
List接口存在两个重载的remove方法:remove(int index)(按索引删除)、remove(Object o)(按元素值删除),当你传入Integer类型的参数时,会优先匹配remove(Object o),所以会提示你传入的是对象而非整型索引 - 你调试时看到的「返回单元素int数组」属于错觉,本质是代码逻辑错误导致你把单个Integer元素存成了嵌套列表结构
修复方案
- 提前存储当前bucket的索引到临时int变量,避免重复调用迭代器方法引发逻辑错误
- 修复循环括号缩进问题,保证循环层级正确
- 调用
remove方法时如果是按索引删除,把参数强转为int即可匹配到正确的重载方法
修正后的代码示例
public static ArrayList<List<Integer>> isItPossible(String word, LinkedList<List<String>> buckets) { ListIterator<List<String>> bucketIterator; ListIterator<String> wordIterator; List<String> bucket; ArrayList<List<Integer>> enemies; enemies = new ArrayList<>(); bucketIterator = buckets.listIterator(); while(bucketIterator.hasNext()) { bucket = bucketIterator.next(); // 提前存储当前bucket索引,避免后续重复调用迭代器方法出错 int currentBucketIdx = bucketIterator.previousIndex(); wordIterator = bucket.listIterator(); enemies.add(new ArrayList<>()); // 直接加int值,不会出现嵌套列表 enemies.get(enemies.size() - 1).add(currentBucketIdx); while(wordIterator.hasNext()) { if(!isCompatible(word, wordIterator.next())) { enemies.get(currentBucketIdx).add(wordIterator.previousIndex()); } } } // 补充原方法缺失的返回语句 return enemies; }
内容的提问来源于stack exchange,提问作者J.S
相关产品推荐
相关产品推荐

