【问题标题】:How can I pick out the odd numbers and even numbers from a given array and then store them in another array?如何从给定数组中取出奇数和偶数,然后将它们存储在另一个数组中?
【发布时间】:2021-05-28 21:10:26
【问题描述】:

如何从给定数组中取出奇数和偶数,然后将它们存储在另一个数组中?流程是:奇数到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] + " ");
}

【问题讨论】:

  • 为奇数和偶数元素创建一个新的计数器变量,从零开始将其分配给新数组中的该索引,并在您为这些计数器分配奇数或偶数时始终递增
  • 您应该更改 num 还是只从 num 获取数字?
  • @depperm,我会从 num 中获取数字
  • 您的数组元素分配方式错误。您希望将找到的偶数/奇数存储在 oddeven 数组中,而不是修改原始 num 数组。所以应该是odd[i] = num[i];
  • 做两个索引变量intoddIndice = 0 int evenIndice = 0。然后如果它是偶数(根据你的情况检查)做even[evenIndice] = num[i]; evenIndice ++;

标签: java arrays for-loop


【解决方案1】:

您可以在一个循环中完成所有这些 - 这会更快。要知道输入数字的正确位置,请为每个数组添加额外的计数器。

你的方法

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 数组的长度。然后你应该使用数组列表或计算每个或其他东西的值。

更动态的方法

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

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++;
    }
}

【讨论】:

  • 先生解释得很好!!!非常感谢您的指导!!特别是关于如何确定数组大小的动态方法!非常感谢!!!
【解决方案2】:

检测oddeven 数字的方法是正确的,但我认为您编写的代码的问题在于oddeven 数组的长度不是决定因素。所以对于这个问题,我建议使用ArrayList&lt;Integer&gt;,假设您在函数输入中获取数组,并希望在输出中使用数组(我将在输出中混合数组以获得更好的性能。但分离每个列表的函数提取也可以,具体取决于您要对它们做什么)。

解决方案

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]

【讨论】:

    【解决方案3】:

    您可以收集一个包含两行的二维数组: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]
    

    【讨论】:

      【解决方案4】:

      在 lambda 中(3 行)

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

      将偶数和奇数 numspartitioningBy 分开:

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

      ...并将生成的List&lt;Integer&gt; 转换为偶数和奇数为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]
      

      【讨论】:

        猜你喜欢
        • 2013-12-23
        • 2021-10-04
        • 2015-06-05
        • 1970-01-01
        • 2016-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多