【问题标题】:Array not copying another array数组不复制另一个数组
【发布时间】:2021-03-06 19:19:25
【问题描述】:

我正在尝试开发一个程序来删除数组中的所有中间值(如果它有奇数个元素,则中间值,如果它有偶数个元素,则两个中间值)直到只有两个左侧元素,元素 [0] 和 [1]。例如,如果用户输入 1, 2, 3, 4, 5,程序将返回 [1, 5]。我记下了我认为在逻辑上可能会有所帮助的内容,但是我的数组 x 没有在 for 循环中复制 myArray 。我不是在寻找完全为我编写代码的人,只是为了指出我错在哪里。这是我的代码:

import java.util.*;
public class Deletion
{
   public static void main(String[]args)
   {
      Scanner kb = new Scanner(System.in);
      System.out.println("Please enter the array length:");
      int [] myArray = new int[kb.nextInt()];
      int [] x = new int[myArray.length - 1];
      int index1 = 0;
      int index2 = 0;
      int index3 = 0;
      if(myArray.length < 3)
      {
         System.out.println("Please make sure array length is greater than two. Run again.");
         System.exit(0);
      }
      else
      {
         for(int i = 0; i < myArray.length; i++)
         {
            System.out.println("Please enter a number for position " + i + ":");
            myArray[i] = kb.nextInt();
         }
         for(int i = 0; i < myArray.length; i++)
         {
            while(myArray.length > 2)
            {
               if(myArray.length%2 != 0)
               {
                  index1 = (myArray.length/2);
                  for(int j = 0, r = 0; j < myArray.length; j++)
                  {
                     if(j != index1)
                     {
                        x[r++] = myArray[j];
                        myArray = x;
                     }
                  }
                  x = new int[myArray.length - 1];
               }
               else
               {
                  index2 = (myArray.length/2);
                  index3 = (myArray.length/2 - 1);
                  for(int j = 0, r = 0; j < myArray.length; j++)
                  {
                     if(j != index2 && j != index3)
                     {
                        x[r++] = myArray[j];
                        myArray = x;
                     }
                  }
                  x = new int[myArray.length - 1];
               }
            }
         }
      }
      System.out.println(Arrays.toString(myArray));
   }
}

【问题讨论】:

  • 你对myArray = x;这句话的作用有什么理解?
  • x = new int[myArray.length - 1] 将创建一个新数组并将所有值设置为 0,因此您正在破坏刚刚填充的结果。尝试在循环之前移动它。
  • 顺便说一下,我们通常所说的中位数是有序序列的中间元素。
  • 最终的数组应该包含最小值和最大值?
  • @user2740650 - 我故意这样做是为了让每个循环都比 myArray 小一个,因为没有一种简单的方法可以删除元素。

标签: java arrays for-loop


【解决方案1】:

您必须创建数组并填充它,否则它使用相同的内存地址,因此将无法工作。使用以下内容:

myArray = ArrayUtils.clone(x);

【讨论】:

  • 感谢您的提示,我试过了,但一直说找不到符号。
【解决方案2】:

当您执行“myArray = x”时,您实际上只是分配了对数组的引用。因此,如果您对一个数组进行任何更改,它也会反映在其他数组中,因为 myArray 和 x 都指向内存中的同一位置。

因此,您需要的是

myArray = x.clone();

【讨论】:

    【解决方案3】:

    我稍微清理了你的代码。根据您的描述,真正重要的是拉入数组中的最小值和最大值 - 其他所有内容都将被删除,因此您只需遍历数组即可找到这两个值。

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean isValid = false;
        int validLength = 0;
        System.out.println("Please enter the array length:");
        while (!isValid) {
            int length = scanner.nextInt();
            if (length < 3) {
                System.out.println("Please make sure array length is greater than two. Try again.");
            }
            else {
                isValid = true;
                validLength = length;
            }
        }
        int minimumValue = Integer.MAX_VALUE, maximumValue = Integer.MIN_VALUE;
        for (int i = 0; i < validLength; i++) {
            System.out.println("Please enter a number for position " + i + ":");
            int nextInt = scanner.nextInt();
            if (nextInt < minimumValue) minimumValue = nextInt;
            else if (nextInt > maximumValue) maximumValue = nextInt;
        }
        System.out.println(Arrays.toString(new int[] {minimumValue, maximumValue}));
    }
    

    编辑:进行了另一个修订,因为不需要使用数组。只需在输入时跟踪最小值和最大值即可。

    【讨论】:

      猜你喜欢
      • 2022-07-05
      • 2017-09-13
      • 1970-01-01
      • 2011-05-08
      • 2022-01-14
      • 2013-07-09
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      相关资源
      最近更新 更多