Java从用户输入整数数组筛选素数返回ArrayList问题排查
代码错误点汇总
- 条件判断语法错误:
if(ris=true)是赋值操作,并非相等判断,会强制将ris设为true,导致所有输入元素都被加入结果列表,正确写法为if(ris) - 标志位
ris初始化位置错误:需放在遍历数组元素的循环内部,每次判断新元素前重置状态,否则前一个元素的判断结果会影响后续元素 - 素数判定逻辑存在多处漏洞:
- 未过滤小于2的整数(小于2的数均不是素数)
- 大于3的奇数没有做整除校验,9、15这类非素数奇数会被误判为素数
- 等于3的场景下内层循环不会执行,ris未被正确赋值为true
- 泛型使用不规范:
arrayPrimi方法返回值未指定泛型,main方法中接收返回值的类型错误写为ArrayList<int[]>,与实际返回的ArrayList<Integer>不匹配
修复后完整代码
package numeriPrimi; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class NumeriPrimi { public static ArrayList<Integer> arrayPrimi(int[] number) { ArrayList<Integer> listaPrimi = new ArrayList<>(); // 遍历数组每个元素 for (int j : number) { boolean isPrime = true; // 小于2的数不是素数 if (j < 2) { isPrime = false; } else if (j == 2) { isPrime = true; } else if (j % 2 == 0) { // 大于2的偶数不是素数 isPrime = false; } else { // 奇数只需要判断到平方根,步长为2减少循环次数 for (int k = 3; k <= Math.sqrt(j); k += 2) { if (j % k == 0) { isPrime = false; break; } } } if (isPrime) { listaPrimi.add(j); } } return listaPrimi; } public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入数组长度:"); int l = Integer.parseInt(input.nextLine()); int[] numbers = new int[l]; System.out.println("请输入数组元素:"); for (int i = 0; i < numbers.length; i++) { numbers[i] = input.nextInt(); } System.out.println("输入的数组为:" + Arrays.toString(numbers)); ArrayList<Integer> lista = NumeriPrimi.arrayPrimi(numbers); System.out.println("数组中的素数如下:\n" + lista); } }
内容的提问来源于stack exchange,提问作者Maryam Z
相关产品推荐
相关产品推荐

