【问题标题】:2D array - specify amount to new 2d array二维数组 - 指定新二维数组的数量
【发布时间】:2017-04-16 17:37:38
【问题描述】:

我有一个 48 x 48 的二维双数数组,我正在尝试制作一种允许用户选择特定数量的方法,例如= 7 x 7,然后将其放入一个新的二维数组中。

public static double[][] amountOTP(double [][] a, int x){
    a = new double[x][x];
    return a;
}

这就是我现在所拥有的,这需要一个二维数组作为输入,但是即使我指定了 x 它也不起作用。

【问题讨论】:

  • 新数组究竟应该包含什么?
  • “它不起作用” - 这是什么意思?你期望发生什么,而不是发生什么?
  • 您的意思是要将二维数组的大小截断为用户指定的数字吗? (所以基本上使二维数组更小,但保持它的值吗?)
  • @AlexanderDaum 我的二维数组矩阵是 48 x 48,基本上我希望这个方法可以创建一个新的二维数组,其中仅包含原始二维数组中的 7 x 7 数据
  • @YorickIsTheBest 是的先生

标签: java arrays multidimensional-array


【解决方案1】:

当您想将其切割成更小的尺寸并复制原始数组的一部分时,这应该可以:

public static double [][] cutArray (double [][] a, int newSize){
  if (x > a.length)
     throw new IllegalArgumentException ("Can only make array smaller");
  double [][] b = new double [newSize][newSize];
  for (int i = 0; i < newSize; i++){
    for (int j = 0; j < newSize; j++){
      b [i][j] = a [i][j];
    }
  }
  return b;
}

【讨论】:

    【解决方案2】:

    下面的解决方案考虑了请求的新二维数组长度大于原始的情况,在这种情况下我们只需返回原始的。

    例子:

    public static double[][] amountOTP(double [][] a, int x){
           if(x > a.length) return a;
           for (double[] arr : a)
              if(arr.length < x)
                 return a;
    
           double[][] newArray = new double[x][x];
           for (int i = 0; i < x; i++)
              for (int j = 0; j < x; j++)
                 newArray[i][j] = a[i][j];
    
           return newArray;
    }
    

    【讨论】:

    • 描述与代码不匹配:“请求的长度...小于原始长度”应改为“大于”
    【解决方案3】:

    对不起,如果我错了,但我现在假设您希望您的方法返回一个较小的二维数组,其中包含给定数组的一些值,在这种情况下,您需要将您的方法更改为这个:

    public static double[][] amountOTP(double [][] a, int x) {
       double[][] b = new double[x][x];
       x = Math.min(x, a.length);
       for(int i = 0;i < x; i++)
          for(int j = 0;j < x; j++)
             b[i][j] = a[i][j];
       return b;
    }
    

    这应该可以正常工作,但如果我遗漏了任何内容或它不起作用,请随时发表评论并通知我;我是来帮忙的。无论如何,我希望这对你有用。 (另外,如果这不是您想要的答案,请随时告诉我。)

    注意:这应该避免IndexOutOfBounds 异常,因此如果用户提供的x 值大于a 的大小,它仍然可以正常工作。此方法返回的 2d 数组将只有一些零值,它无法找到任何数字。

    【讨论】:

    • @JokesOnyou 没问题!很高兴我能帮上忙。
    • @OsumaneMahyDiaw 如果长度小于原始数组,则可以。值将被复制。 (但不是全部;只是那些可以适应的。)我假设a 中的一维数组的大小都相同并且等于a 本身的长度,使二维数组成为正方形。如果 OP 需要它,我将编辑我的答案以适应不是正方形的矩阵。
    • x&lt;a.length?x:a.length 使用 Math.min 或至少添加一些空格。
    • @PatrickParker 忘记了空格,所以我现在添加,但是Math.min? x 是一个整数...
    • @YorickIsTheBest 是的,它也适用于整数。为了清楚起见,有些人可能更喜欢它而不是三元运算符,尤其是在回答初学者时
    【解决方案4】:

    我认为您正在寻找类似的东西:

    public static double[][] amountOTP(double [][] a, int x){
        double [][] ret = new double[x][x];
    
        for(int i = 0; i < x; i++)
            for(int j = 0; j < x; j++)
                ret[i][j] = a[i][j];
        return ret;
    }
    

    但是你必须小心参数,因为它可能会导致 IndexOutOfBounds 异常

    【讨论】:

      【解决方案5】:

      我看到你已经有了很多答案,但没有人使用优秀的 Arrays.copyOf Java API 方法:

      public static double[][] amountOTP(double [][] a, int x){
          a = Arrays.copyOf(a, x);
          for(int i=0; i<a.length; i++) {
              if(a[i] != null) {
                  a[i] = Arrays.copyOf(a[i], x);
              } else {
                  a[i] = new double[x]; // allows growth
              }
          }
          return a;
      }
      

      【讨论】:

        【解决方案6】:

        你实际上还没有初始化数组,所以方法应该是这样的

        public static void main(String[] args)
            {
                double[][] a=amountOTP(3);
                for(int j=0;j<a.length;++j)
                {
                    for(int i=0;i<a[j].length;++i)
                    {
                        a[j][i]=2;
                    }
                }
                for(int j=0;j<a.length;++j)
                {
                    for(int i=0;i<a[j].length;++i)
                    {
                        System.out.println(a[j][i]);
                    }
                }
        
        
            }
            public static double[][] amountOTP(int x)
            {
                return new double[x][x];
        
            }
        

        【讨论】:

        • @JokesOnyou 如果有帮助,您可以接受它作为答案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 2021-10-23
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多