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

