【问题标题】:How to make a new array out of only even numbers?如何只用偶数创建一个新数组?
【发布时间】:2021-09-09 01:22:42
【问题描述】:

基本上,我正在尝试创建一个新长度的全新数组,其中仅包含整数数组中的偶数 ints
但是,我收到了index out of bounds error。你能帮我找出我做错了什么吗?

import java.util.Arrays;
public class findevens {

    public static void main(String[] args) {
        System.out.println(Arrays.toString(evens(new int[]{4,8,19,3,5,6})));
    }

    public static int[] evens(int[] arr) {
        //create new array by determining length
        //of even number ints
        int length = 0;
        int j = 0;
        for (int i = 0; i < arr.length; i++) 
        {
            if (arr[i] % 2 == 0) {
                length++;
            }   
        }   
        int[] result = new int[length];
        //add even ints to new array
        for (int i = 0; i < arr.length; i++) 
        {
            if (arr[i] % 2 == 0) {
                result[i] += arr[i];
            }
        }
        return result;
    }
}

【问题讨论】:

  • 在第二个循环中,您需要一个额外的计数器变量来插入新数组,因为您不能只复制到同一个索引。 (例如在循环之前声明int insertionCounter = 0; 并使用result[insertionCounter++] = 设置元素)

标签: java arrays string integer


【解决方案1】:

您应该使用一个新变量来跟踪当前的result 索引(比如j):

public static int[] evens(int[] arr) {
        int length = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % 2 == 0) {
                length++;
            }   
        }   
        
        int[] result = new int[length];
        int j = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % 2 == 0) {
                // Access result with `j` and update its value
                result[j++] = arr[i];
            }
        }
        return result;
    }

【讨论】:

    【解决方案2】:

    您需要为 result 数组添加一个新的 index 变量,并且您的分配也是错误的,因为您将 even 数字添加到结果数组元素中而不是分配。

            int j = 0;
            int[] result = new int[length];
            // add even ints to new array
            for (int i = 0; i < arr.length; i++) 
            {
                if (arr[i] % 2 == 0)
                {
                    result[j++] = arr[i];
                }
            }
    

    【讨论】:

      【解决方案3】:

      问题是您将 i 用于结果数组和原始数组。您应该只在 IF 内增加结果数组(当您找到偶数时),否则,由于 i(原始 arr)的大小比结果数组大,您会超出范围。

      public static int[] evens(int[] arr) {
          //create new array by determining length
          //of even number ints
          int length = 0;
          int j = 0;
          for (int i = 0; i < arr.length; i++) 
          {
              if (arr[i] % 2 == 0) {
                  length++;
              }   
          }   
          int[] result = new int[length];
          //add even ints to new array
          int resultCount = 0;
          for (int i = 0; i < arr.length; i++) 
          {
              if (arr[i] % 2 == 0) {
                  result[resultCount] += arr[i];
                  resultCount++;
              }
          }
          return result;
      }
      

      【讨论】:

        【解决方案4】:

        另外,你可以流式传输:

            int[] array = {1, 3, 4, 5, 6};
            int[] even = IntStream.of(array).filter(item -> item%2 == 0).toArray();
            System.out.println(Arrays.toString(even));
        

        【讨论】:

          【解决方案5】:

          当您想为result[] 赋值时,只需使用数组arr0, 15 中的索引即可。你只需要在第二个循环之前声明一个辅助int aux = 0; 变量并根据arr[i] % 2 == 0 递增所以true

          result[i] += arr[i];
          

          一个

           int aux = 0;
           result[aux++] += arr[i];
          

          完整代码

          public class findevens {
           public static void main(String[] args) {
              System.out.println(Arrays.toString(evens(new int[]{4,8,19,3,5,6})));
          }
          
          public static int[] evens(int[] arr) {
              //create new array by determining length
              //of even number ints
              int length = 0;
              int j = 0;
              for (int i = 0; i < arr.length; i++) {
                  if (arr[i] % 2 == 0) {
                      length++;
                  }   
              }   
              int[] result = new int[length];
              int aux = 0;
              //add even ints to new array
              for (int i = 0; i < arr.length; i++){
                  if (arr[i] % 2 == 0) {
                      result[aux++] += arr[i];
                  }
              }
              return result;
           }
          }
          

          【讨论】:

            【解决方案6】:

            由于您真的不知道结果数组的长度,您可以将它们复制到当前数组的前面。然后使用最终位置作为值的计数。

            int[] input = {1,2,3,4,5,6,7,8,9};
            int k = 0;
            for(int i = 0; i < input.length; i++) {
                if (input[i] % 2 == 0) {
                    input[k++] = input[i];
                }
            }
            int[] evens = Arrays.copyOf(input, k);
            System.out.println(Arrays.toString(evens));
            

            打印

            [2, 4, 6, 8]
            

            【讨论】:

              【解决方案7】:

              一种简单的方法是过滤偶数using the Stream API 并将结果作为数组返回。

              Arrays.stream(arr)
                    .filter(n -> n % 2 == 0)
                    .toArray();
              

              演示:

              import java.util.Arrays;
              
              public class Main {
                  public static void main(String[] args) {
                      System.out.println(Arrays.toString(evens(new int[] { 4, 8, 19, 3, 5, 6 })));
                  }
              
                  static int[] evens(int[] arr) {
                      return Arrays.stream(arr).filter(n -> n % 2 == 0).toArray();
                  }
              }
              

              输出:

              [4, 8, 6]
              

              你的代码出了什么问题:

              result.length 是 3,因此在 result[] 中,您可以访问的最大索引是 2(即 result.length -1),而您的第二个循环计数器上升到 5(即 arr.length - 1)并且您使用的是相同的计数器访问 result[] 中的元素导致 ArrayIndexOutOfBoundsException

              如果您想以自己的方式进行操作,则需要为result[] 使用单独的计数器,例如

              int[] result = new int[length];
              //add even ints to new array
              for (int i = 0, j = 0; i < arr.length; i++) 
              {
                  if (arr[i] % 2 == 0) {
                      result[j++] = arr[i];
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2017-11-18
                • 2011-02-09
                • 1970-01-01
                • 1970-01-01
                • 2012-12-16
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多