java 如何在方法中更改整数数组

k5ifujac  于 2022-11-27  发布在  Java
关注(0)|答案(3)|浏览(202)

我遇到了一个数字教科书中的填充代码问题。所有的代码都是永久性的,不能更改,所以这个问题只能通过使用//Write code here区域来解决。
该问题要求实现removeOdd方法。

import java.util.Arrays;

public class RemoveTester
{
   public static int removeOdd(int[] values, int size) 
   { 
      //Write code here
   }
   public static void main(String[] args)
   {
      int[] a = { 22, 98, 95, 46, 31, 53, 82, 24, 11, 19 };
      int sizeBefore = 8;
      int sizeAfter = removeOdd(a, sizeBefore);
      System.out.print("a: [ ");
      for (int i = 0; i < sizeAfter; i++) 
      {
         System.out.print(a[i] + " ");
      }
      System.out.println("]");
      System.out.println("Expected: [ 22 98 46 82 24 ]");      

      int[] b = { 23, 97, 95, 45, 31, 53, 81, 24, 11, 19 };
      sizeBefore = 7;
      sizeAfter = removeOdd(b, sizeBefore);
      System.out.print("b: [ ");
      for (int i = 0; i < sizeAfter; i++) 
      {
         System.out.print(b[i] + " ");
      }
      System.out.println("]");
      System.out.println("Expected: [ ]");      
   }
}

我尝试实现removeOdd的方法是:

int evenCount = 0;
      
      for(int i = 0; i<size; i++){
         if(values[i]%2==0){
            evenCount++;
         }
      }
      int[] newValues = new int[evenCount];
      int newCount =0;
      for(int i = 0; i<evenCount; i++){
         if(values[i]%2==0){
            newValues[newCount] = values[i];
            newCount++;
         }
      }
      values = newValues;
      return evenCount;

当程序被编译和运行时,main会打印原始a或b数组的开头,而不是只打印a或b中的偶数元素。我找不到一种方法来将removeOdd方法中的原始数组更改为只包含偶数元素的新数组。我也想不出任何其他方法来做到这一点。如果有任何帮助,我将不胜感激!

92vpleto

92vpleto1#

其他答案很好给予描述了您的总体方法存在的问题......也就是说,为什么您的结果不能返回到调用方法。
如果你的代码在其他方面都是正确的,你可以直接使用它,并在最后将结果复制回原始数组。事实上,你的逻辑中有一个缺陷。所以如果你修复了这个缺陷,然后在最后进行复制,你应该会得到正确的结果:

public static int removeOdd(int[] values, int size)
{
    int evenCount = 0;

    for(int i = 0; i<size; i++){
        if(values[i]%2==0){
            evenCount++;
        }
    }
    int[] newValues = new int[evenCount];
    int newCount =0;
    for(int i = 0; i<size; i++) {    // <- Need to iterate over the entire input array
        if(values[i]%2==0){
            newValues[newCount] = values[i];
            newCount++;
        }
    }
    for (int i = 0 ; i < evenCount ; i++)  // <- now copy your result to the original array
        values[i] = newValues[i];
    return evenCount;
}

您可以使用相同的逻辑直接复制到原始数组中,而不必创建额外的数组来临时保存偶数值:

public static int removeOdd(int[] values, int size)
{
    int newCount =0;
    for(int i = 0; i<size; i++) {
        if(values[i]%2==0){
            values[newCount] = values[i];
            newCount++;
        }
    }
    return newCount;
}
1tuwyuhd

1tuwyuhd2#

由于Java是按值传递而不是按引用传递,因此设置values参数的值不会更改a变量的值。
你要做的就是从数组中删除所有的奇数元素,并将剩下的偶数元素左移,这样a的实际结果形式看起来就像这样:
{22, 98, 46, 82, 24, 0, 0, 0, 0, 0}

lqfhib0f

lqfhib0f3#

正如@Geoff所指出的,Java是通过值传递的,这意味着当你将数组作为参数传递时,你在方法中得到的是对数组对象的引用,它不同于你在main方法中的原始引用int[] a因此,当执行values = newValues;时,您将把用于指向与int[] a相同对象的新引用指向newValues所指向的数组对象,从而不更新原始数组a,但实际上丢失了对它的任何引用。

相关问题