17370845950

如何用Java分离数组中的奇数与偶数并分别存储到两个新数组中

本文详解如何正确读取用户输入的整数数组,遍历判断每个元素的奇偶性,并将奇数、偶数分别存入独立数组——重点解决初学者常见的变量作用域、方法误用、数组不可调用add()等编译错误。

在Java中,数组是固定长度的静态容器,不支持add()方法(该方法属于ArrayList等集合类),也不能跨作用域直接访问局部变量(如main()中声明的oddarray在类外方法中不可见)。原代码中出现的numOfVal cannot be resolved、cannot invoke add(int) on the array type int[]等错误,根源在于混淆了基本数组动态集合的使用方式,且未合理管理变量生命周期与作用域。

下面是一个健壮、可运行、带完整输入校验的专业实现方案:

✅ 核心设计思路

  • 使用Scanner统一管理标准输入,避免重复创建与过早关闭;
  • 用List暂存奇偶元素(自动扩容,规避预估长度难题);
  • 输入阶段严格校验:非数字、空输入、超出int范围均提示重试;
  • 最后通过stream().mapToInt(...).toArray()高效转为int[];
  • 所有逻辑封装在实例方法中,避免静态污染,提升可维护性。

✅ 完整可运行代码

import java.util.*;

public class CountEvenOddArray {
    private final String LS = System.lineSeparator();
    private int[] mainArray;

    public static void main(String[] args) {
        new CountEvenOddArray().startApp(args);
    }

    private void startApp(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 步骤1:获取数组长度(带校验)
        String inputSize = "";
        while (inputSize.isEmpty()) {
            System.out.print("Enter number of elements you want to store (or 'q' to quit): -> ");
            inputSize = sc.nextLine().trim();
            if (inputSize.equalsIgnoreCase("q")) {
                System.out.println("Quitting - Bye Bye");
                return;
            }
            if (!isInteger(inputSize)) {
                System.out.println("Invalid entry! (" + inputSize + ") Try again..." + LS);
                inputSize = "";
            }
        }
        int size = Integer.parseInt(inputSize);
        mainArray = new int[size];

        // 步骤2:逐个录入元素(带校验)
        System.out.println("\nEnter the elements of the array ('q' to quit):");
        for (int i = 0; i < size; i++) {
            String elemStr = "";
            while (elemStr.isEmpty()) {
                System.out.print("Enter Element #" + (i + 1) + ": -> ");
                elemStr = sc.nextLine().trim();
                if (elemStr.equalsIgnoreCase("q")) {
                    System.out.println("Quitting - Bye Bye");
                    return;
                }
                if (!isInteger(elemStr)) {
                    System.out.println("Invalid entry! (" + elemStr + ") Try again..." + LS);
                    elemStr = "";
                }
            }
            mainArray[i] = Integer.parseInt(elemStr);
        }

        // 步骤3:分离奇偶数 → 使用ArrayList动态收集
        List oddList = new ArrayList<>();
        List evenList = new ArrayList<>();
        evenOdds(oddList, evenList);

        // 步骤4:转换为int[]并输出
        int[] oddArray = oddList.stream().mapToInt(Integer::intVa

lue).toArray(); int[] evenArray = evenList.stream().mapToInt(Integer::intValue).toArray(); System.out.println("\n" + oddArray.length + " odd elements: " + Arrays.toString(oddArray)); System.out.println(evenArray.length + " even elements: " + Arrays.toString(evenArray)); } private void evenOdds(List odd, List even) { for (int value : mainArray) { if (value % 2 == 0) { even.add(value); } else { odd.add(value); } } } // 健壮的整数校验(支持负数 & 边界检查) private boolean isInteger(String str) { if (str == null || str.trim().isEmpty()) return false; try { Integer.parseInt(str); // 自动处理符号与溢出 return true; } catch (NumberFormatException e) { return false; } } }

⚠️ 关键注意事项

  • 不要用int[]直接调用add():数组无此方法,改用ArrayList
  • 变量作用域必须清晰:oddarray/evenarray若在main()中定义,则EvenOdds()方法内无法访问;应通过参数传递或提升为成员变量(本例采用传参更安全);
  • 避免硬编码数组长度(如new int[100]):用户输入长度未知,易造成空间浪费或越界;
  • 输入校验不可省略:nextInt()遇非数字会卡死,nextLine()配合trim()+正则/异常捕获更可靠;
  • Scanner无需手动关闭:JVM退出时自动释放资源;若提前关闭,后续nextLine()将抛IllegalStateException。

运行示例:

Enter number of elements you want to store (or 'q' to quit): -> 5

Enter the elements of the array ('q' to quit):
Enter Element #1: -> 1
Enter Element #2: -> 3
Enter Element #3: -> 2
Enter Element #4: -> 5
Enter Element #5: -> 4

3 odd elements: [1, 3, 5]
2 even elements: [2, 4]

此方案兼顾健壮性、可读性与工程实践规范,适合教学与实际项目复用。