如何从 for 循环值创建单个数组

Pro*_*224 1 java arrays for-loop

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) + " ");
        }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Aiv*_*ean 5

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

div1.作为单独的步骤计算 的大小:

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));
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以随后将集合转换为原始数组:

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

3. 单线使用Stream

正如@Eritrean评论中所建议的,您可以使用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));
Run Code Online (Sandbox Code Playgroud)

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


PS 为了简洁起见,我省略了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));
}
Run Code Online (Sandbox Code Playgroud)

  • 无需存储在列表中然后转换为数组,只需使用 IntStream 即可: `int[] div = IntStream.range(1, a).filter(i -&gt; a % i == 0).map(i -&gt; a / i).toArray();` (2认同)