You need to enable JavaScript to run this app. 为什么ListIterator.previousIndex()返回单元素整型数组而非int值?
优惠活动
大模型
产品
解决方案
定价
更多

为什么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元素存成了嵌套列表结构

修复方案

  1. 提前存储当前bucket的索引到临时int变量,避免重复调用迭代器方法引发逻辑错误
  2. 修复循环括号缩进问题,保证循环层级正确
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 02:57:04