如何向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
相关产品推荐
相关产品推荐

