You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向ArrayList非连续索引添加元素并展示索引与对应值

问题分析与解决方案

首先,你的原始代码存在一个问题:直接调用geno.set(2, 0)会抛出IndexOutOfBoundsException——刚创建的ArrayList是空的,不存在索引为2的元素。需要先确保ArrayList的大小足够容纳目标索引位置,比如初始化时指定大小,或先填充前置索引的占位元素。

以下是几种实现遍历并输出指定格式的方案:

方案1:普通for循环(最直接)

先初始化ArrayList到足够大小,再用普通for循环遍历目标索引范围:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> geno = new ArrayList<>(6); // 初始化大小为6,覆盖索引0-5
        // 填充前置索引的占位元素
        for (int i = 0; i < 6; i++) {
            geno.add(null);
        }
        geno.set(2, 0);
        geno.set(3, 0);
        geno.set(4, 0);
        geno.set(5, 0);

        StringBuilder sb = new StringBuilder("{");
        // 遍历目标索引2到5
        for (int i = 2; i <= 5; i++) {
            sb.append(i).append(" -> ").append(geno.get(i));
            if (i != 5) {
                sb.append("; ");
            }
        }
        sb.append("}");
        System.out.println(sb.toString());
    }
}

输出结果:

{2 -> 0; 3 -> 0; 4 -> 0; 5 -> 0}

方案2:IntStream遍历索引(Java 8+)

利用IntStream生成目标索引范围,通过流式操作拼接输出:

import java.util.ArrayList;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> geno = new ArrayList<>(6);
        for (int i = 0; i < 6; i++) {
            geno.add(null);
        }
        geno.set(2, 0);
        geno.set(3, 0);
        geno.set(4, 0);
        geno.set(5, 0);

        String result = IntStream.rangeClosed(2, 5)
                .mapToObj(i -> i + " -> " + geno.get(i))
                .reduce((s1, s2) -> s1 + "; " + s2)
                .map(s -> "{" + s + "}")
                .orElse("{}");
        System.out.println(result);
    }
}

方案3:forEach结合AtomicInteger追踪索引

如果一定要用forEach,可以借助AtomicInteger记录当前索引,同时过滤掉不需要的前置索引:

import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> geno = new ArrayList<>(6);
        for (int i = 0; i < 6; i++) {
            geno.add(null);
        }
        geno.set(2, 0);
        geno.set(3, 0);
        geno.set(4, 0);
        geno.set(5, 0);

        AtomicInteger index = new AtomicInteger(0);
        StringBuilder sb = new StringBuilder("{");
        geno.forEach(value -> {
            int currentIndex = index.getAndIncrement();
            if (currentIndex >= 2 && currentIndex <= 5) {
                sb.append(currentIndex).append(" -> ").append(value);
                if (currentIndex != 5) {
                    sb.append("; ");
                }
            }
        });
        sb.append("}");
        System.out.println(sb.toString());
    }
}

额外优化建议

如果你的场景仅需要存储特定索引与值的映射,推荐使用HashMap<Integer, Integer>,无需填充空索引,更节省空间:

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<Integer, Integer> geno = new HashMap<>();
        geno.put(2, 0);
        geno.put(3, 0);
        geno.put(4, 0);
        geno.put(5, 0);

        StringBuilder sb = new StringBuilder("{");
        for (Map.Entry<Integer, Integer> entry : geno.entrySet()) {
            sb.append(entry.getKey()).append(" -> ").append(entry.getValue()).append("; ");
        }
        // 移除末尾多余的分号和空格
        if (sb.length() > 1) {
            sb.setLength(sb.length() - 2);
        }
        sb.append("}");
        System.out.println(sb.toString());
    }
}

内容的提问来源于stack exchange,提问作者Diogo Guilherme Pereira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:17:22