如何从给定数组中提取奇数和偶数,并将它们存储在另一个数组中?

3

如何从给定的数组中挑选出奇数和偶数,并将它们存储在另一个数组中?流程如下:奇数将存储到 odd[] 数组中,而偶数将存储到 even[] 数组中。

以下是我的代码,但我不确定是否正确,因为它似乎同时存储和输出一些零和偶数,没有奇数的存在...

int[] num = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

int[] odd = new int[10];
int[] even = new int[10];

for (int i = 0; i < num.length; i++) {  // For odd numbers
    if (num[i] % 2 != 0) {
        num[i] = odd[i];
    }
    System.out.println(num[i] + " ");
}

for (int j = 0; j < num.length; j++) {  // For even numbers
    if (num[j] % 2 == 0) {
        num[j] = even[j];
    }
    System.out.println(num[j] + " ");
}

1
为奇数和偶数元素创建一个新的计数器变量,从零开始为此索引分配到新数组,并在分配奇数或偶数数字时始终递增这些计数器。 - Aalexander
2
你的数组元素赋值方式不正确。你想要将找到的偶数/奇数存储在oddeven数组中,而不是修改原始的num数组。因此应该是odd[i] = num[i]; - user6073886
数组始终是一个正数序列吗?或者数字可以是任何值? - Mike B
@OHGODSPIDERS,你只需要在这个奇数和偶数数组中分别赋值每隔一个的值。 - Aalexander
1
执行两个指数变量int oddIndice = 0int evenIndice = 0。然后,如果它是偶数(按照您的条件检查),则执行even[evenIndice] = num[i]; evenIndice ++; - Aalexander
显示剩余3条评论
4个回答

2
检测奇偶数的方法是正确的,但我认为你编写的代码问题在于奇数和偶数数组的长度不确定。因此,我建议使用 ArrayList<Integer>。假设您在函数输入中获取了数组,并希望在输出中得到数组(为了更好的性能,我将混合数组放在输出中。但根据您要执行的操作,也可以将每个列表提取的函数分开)。

解决方案

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {
    public static Integer[][] separateOddnEven(int[] input) {
        Integer[][] output = new Integer[2][];
        List<Integer> odds = new ArrayList<>();
        List<Integer> evens = new ArrayList<>();
        for (int i = 0; i < input.length; ++i) {
            int temp = input[i];
            if (temp % 2 == 0)
                evens.add(temp);
            else
                odds.add(temp);
        }
        // alternative is to use these Arraylists directly
        output[0] = new Integer[odds.size()];
        output[1] = new Integer[evens.size()];
        output[0] = odds.toArray(output[0]);
        output[1] = evens.toArray(output[1]);
        return output; // index 0 has odd numbers and index 1 has even numbers.
    }

    public static void main(String[] args) {
        int[] input = {0, 21, 24, 22, 14, 15, 16, 18};
        Integer[][] output = separateOddnEven(input);
        System.out.println("odd numbers :");
        System.out.println(Arrays.toString(output[0]));
        System.out.println("even numbers :");
        System.out.println(Arrays.toString(output[1]));
    }
}

输出:

odd numbers :
[21, 15]
even numbers :
[0, 24, 22, 14, 16, 18]

2

您可以在一个循环中完成所有操作——这样会更快。为了知道将数字放入正确位置,对每个数组添加额外计数器。

您的方法

int[] num = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
int[] odd = new int[10];
int[] even = new int[10];
int oddPos = 0;
int evenPos = 0;
for (int i = 0; i < num.length; i++) {
    if (num[i] % 2 == 0) {
        even[evenPos] = num[i];
        evenPos++;
    } else {
        odd[oddPos] = num[i];
        oddPos++;
    }
}

然而,这不是最好的解决方案,因为你(在大多数情况下)无法预先确定oddeven数组的长度。那么,您应该使用arraylists或计算每个值的数量或其他方法。

更具动态性的方法

如前所述,您需要首先确定数组的大小。

int[] num = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
int oddCount = 0, evenCount = 0;
int oddPos = 0, evenPos = 0;
//get the count of each type
for (int i = 0; i < num.length; i++) {
    if (num[i] % 2 == 0)
        oddCount++;
    else
        evenCount++;
}
//define arrays in correct sizes
int[] odd = new int[oddCount];
int[] even = new int[evenCount];
//put values in arrays
for (int i = 0; i < num.length; i++) {
    if (num[i] % 2 == 0) {
        even[evenPos] = num[i];
        evenPos++;
    } else {
        odd[oddPos] = num[i];
        oddPos++;
    }
}

1
非常好的解释,先生!非常感谢您的指导!!特别是关于动态确定数组大小的方法!非常感谢!!! - Ralph Henry

1
在lambda中(3行)。
int[] nums = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

将偶数和奇数用partitioningBy分开:

Map<Boolean, List<Integer>> map = IntStream.of(nums)
        .boxed().collect(partitioningBy(n -> (n & 1) == 0));

...并将得到的List<Integer>转换为int[],分别存储偶数和奇数:

int[] even = map.get(true).stream().mapToInt(i -> i).toArray();
int[] odd = map.get(false).stream().mapToInt(i -> i).toArray();

System.out.println("even numbers: " + Arrays.toString(even));
System.out.println("odd numbers:  " + Arrays.toString(odd));

even numbers: [2, 4, 6, 8, 10, 12, 14, 16]
odd numbers:  [1, 3, 5, 7, 9, 11, 13, 15]

1
你可以通过以下方法收集一个包含两行的二维数组:evenodd
int[] num = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

// a 2d array of two rows: even and odd
int[][] arr = new int[2][];
// process a 1d array and fill a 2d array
Arrays.stream(num).boxed()
        // Map<Integer,List<Integer>>
        .collect(Collectors.toMap(
                // key: 0 - even, 1 - odd
                n -> n % 2,
                // value - a list of one
                // element, i.e. number
                n -> new ArrayList<>(List.of(n)),
                // merge duplicates
                (list1, list2) -> {
                    list1.addAll(list2);
                    return list1;
                }))
        // fill the rows of a 2d array: even and odd
        .forEach((key, value) -> arr[key] = value.stream()
                .mapToInt(Integer::intValue).toArray());

// output
System.out.println("Even: " + Arrays.toString(arr[0]));
// Even: [2, 4, 6, 8, 10, 12, 14, 16]
System.out.println("Odd: " + Arrays.toString(arr[1]));
// Odd: [1, 3, 5, 7, 9, 11, 13, 15]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接