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

Character类型ArrayList存整数打印异常及素数处理问题

问题分析与解决

核心错误点

1. Character类型存储数字的误解

你用Character类型的ArrayList存储数字时,存的是字符的ASCII值而非实际整数:

  • 比如'5'对应的ASCII码是53,不是整数5,调用isPrime(A.get(i))时传入的是53,素数判断完全错误;
  • 执行Math.pow(A.get(i), 2)时,是对ASCII值做平方运算,比如'9'的ASCII是57,平方后是3249,超出可打印字符范围,所以输出显示为?。

2. 遍历集合时移除元素的索引错误

用普通for循环从前往后遍历ArrayList,移除元素后后续元素会自动前移,导致索引跳过部分元素。比如移除索引i的元素后,原索引i+1的元素会移到i的位置,但循环i会自增,直接跳过该元素的处理。

3. isPrime方法的逻辑漏洞

当输入n≤1时,方法错误返回true(1不是素数);另外循环可以优化为只遍历到n的平方根,减少不必要的计算。


修正后的代码

方案1:改用ArrayList存储整数(推荐)

彻底避免字符与整数的混淆,是最合理的解决方式:

public class PrimeProcessor {
    // 修正素数判断逻辑
    public static boolean isPrime(int n) {
        if (n <= 1) {
            return false;
        }
        if (n == 2) {
            return true;
        }
        // 优化:只遍历到平方根,减少计算量
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

    // 处理整数集合的方法
    public static void prime(ArrayList<Integer> list) {
        // 从后往前遍历,规避移除元素导致的索引错位问题
        for (int i = list.size() - 1; i >= 0; i--) {
            int num = list.get(i);
            if (isPrime(num)) {
                list.remove(i);
            } else {
                list.set(i, num * num);
            }
        }
    }

    // 补充适配Integer类型的remove和replace方法
    public static void removeNum(ArrayList<Integer> list, int target) {
        list.remove(Integer.valueOf(target));
    }

    public static void replaceNum(ArrayList<Integer> list, int oldVal, int newVal) {
        int index = list.indexOf(oldVal);
        if (index != -1) {
            list.set(index, newVal);
        }
    }

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(5);
        list.add(9);
        list.add(4);
        list.add(6);
        list.add(2);
        list.add(1);
        
        removeNum(list, 1);
        System.out.println(list); // 输出:[5, 9, 4, 6, 2]
        
        replaceNum(list, 4, 7);
        System.out.println(list); // 输出:[5, 9, 7, 6, 2]
        
        prime(list);
        System.out.println(list); // 输出:[81, 49, 36](9、7、6非素数,平方后保留;5、2是素数被移除)
    }
}

方案2:强制使用Character类型(不推荐)

需手动在字符与整数间转换,且仅能处理平方后仍为单个数字的情况:

public static boolean isPrime(int n) {
    if (n <= 1) return false;
    if (n == 2) return true;
    for (int i = 2; i <= Math.sqrt(n); i++) {
        if (n % i == 0) return false;
    }
    return true;
}

public static void prime(ArrayList<Character> list) {
    for (int i = list.size() - 1; i >= 0; i--) {
        char c = list.get(i);
        int num = Character.getNumericValue(c); // 字符转整数
        if (isPrime(num)) {
            list.remove(i);
        } else {
            int squared = num * num;
            // 仅处理平方后为单个数字的情况,避免乱码
            if (squared >= 0 && squared <= 9) {
                list.set(i, (char) ('0' + squared));
            } else {
                // 非单个数字时的自定义处理,这里用?标记
                list.set(i, '?');
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者angryhorse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:45:17