【问题标题】:How to create a single array from for loop values如何从 for 循环值创建单个数组
【发布时间】:2026-02-05 12:15:01
【问题描述】:
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter number: ");
        int a = sc.nextInt();
        for ( int i = 1; i < a; i++) {
            int []div = {a/i};
            if (a%i == 0 ) System.out.print(Arrays.toString(div) + " ");
        }
}

输入:68 输出:[68] [34] [17] [4] [2]

问题是如何使单个数组看起来像 [68, 34, 17, 4, 2] ?

【问题讨论】:

    标签: java arrays for-loop


    【解决方案1】:

    由于您无法预先知道div 有多少个元素(它需要对a 进行因式分解),因此您有多种选择:

    1。单独计算div 的大小:

    int a = 68;
    int n = 0; // length of the result
    for (int i = 1; i < a; i++) {
        if (a % i == 0) {
            n++;
        }
    }
    int[] div = new int[n];
    n = 0;
    
    for (int i = 1; i < a; i++) {
        if (a % i == 0) {
            div[n++] = a / i;
        }
    }
    System.out.println(Arrays.toString(div));
    

    2。使用可变增长集合而不是数组:

    int a = 68;
    List<Integer> div = new ArrayList<>();
    for (int i = 1; i < a; i++) {
        if (a % i == 0) {
            div.add(a / i);
        }
    }
    System.out.println(div);
    

    如果你需要,你can convert 集合到原始数组之后:

    int[] divArr = div.stream().mapToInt(Integer::intValue).toArray();
    System.out.println(Arrays.toString(divArr));
    

    3。单行使用Stream

    正如 @Eritrean 在 cmets 中建议的那样,您可以使用 IntStream 来构建您的数组:

    int a = 68;
    int[] div = IntStream
        .range(1, a)
        .filter(i -> a % i == 0)
        .map(i -> a / i)
        .toArray();
    System.out.println(Arrays.toString(div));
    

    它将比第二个变体更有效,因为它避免了创建 Integer 包装器。


    附:为简洁起见,我省略了 main 方法和 Scanner 初始化。如果需要,您可以将其放回原处,例如:

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter number: ");
        int a = sc.nextInt();
        int n = 0; // length of the result
        for (int i = 1; i < a; i++) {
            if (a % i == 0) {
                n++;
            }
        }
        int[] div = new int[n];
        n = 0;
    
        for (int i = 1; i < a; i++) {
            if (a % i == 0) {
                div[n++] = a / i;
            }
        }
        System.out.println(Arrays.toString(div));
    }
    

    【讨论】:

    • 与其存储在列表中然后转换为数组,不如使用 IntStream 代替:int[] div = IntStream.range(1, a).filter(i -&gt; a % i == 0).map(i -&gt; a / i).toArray();
    • @Eritrean,好点子,谢谢。
    • 感谢您的回答,但必须从 Scanner 方法中获取输入。并编写程序打印一组分隔符。所以在例子中我输入数字 44 并且程序打印 [44, 22, 11, 4, 2]
    • @Proximo_224,为简洁起见,我省略了Scanner 创建和int a = sc.nextInt();。如果需要,您可以将其放回原处。否则,这些方法是通用的,适用于任何值 a
    • 谢谢先生,它有效。