【问题标题】:Copying array values to different positions将数组值复制到不同的位置
【发布时间】:2021-06-02 18:58:31
【问题描述】:

我设法完成了第一部分,即创建一个3x2 数组并在其中放入一些数字。但是,我无法为第二部分找到一个好的解决方案。 任务是:

将第 2 行的值复制到第 1 行,将第 3 行的值复制到第 2 行,将第 1 行的值复制到第 3 行

这是我的解决方案:

int[][] m = {{3, 7}, {4, 8}, {5, 9}};

n[0][0] = m[1][0];
n[0][1] = m[1][1];

n[1][0] = m[2][0];
n[1][1] = m[2][1];

n[2][0] = m[0][0];
n[2][1] = m[0][1];

System.out.println("");

for (int[] g : n) {
    for (int h : g)
        System.out.print(h + " ");
    System.out.println("");
}

我尝试使用 for 循环,但无法使其工作。

有人可以帮我找到更好的解决方案吗?

【问题讨论】:

    标签: java arrays sorting


    【解决方案1】:

    如果你想使用for 循环,你可以这样做:

    int [][] m = {{3,7},{4,8},{5,9}};
    
    int[] firstRow = m[0];
    
    for(int i = 1; i < m.length; i++) {
      m[i-1] = m[i];
    }
    
    m[m.length-1] = firstRow;
    

    在上面的代码示例中,第一行临时保存在另一个名为 firstRow 的数组中。之后,我使用了一个 for 循环,其中计数器变量 i 使用第二行的索引进行初始化。

    for 循环内,第二行移至第一行,第三行移至第二行(以此类推,如果有更多行)。

    循环结束后,将临时保存的第一行的值分配给二维数组的最后一行。


    Collections 的高级解决方案

    使用Collections,您可以为您的问题提供更紧凑的解决方案:

    int[][] m = {{3, 7}, {4, 8}, {5, 9}};
    List<int[]> rows = Arrays.asList(m);
    Collections.rotate(rows, -1);
    

    这会将数组中的行旋转 -1。 (第 2 行到第 1 行,第 3 行到第 2 行,...,第 1 行到最后一行)

    【讨论】:

      【解决方案2】:

      要复制数组,您可以使用旧的有用的System.arraycopy()

      public static void main(String... args) {
          int[][] m = { { 3, 7 }, { 4, 8 }, { 5, 9 } };
          int[][] n = new int[m.length][m[0].length];
      
          System.arraycopy(m[1], 0, n[0], 0, m[1].length);    // copy row 2 to row 1
          System.arraycopy(m[2], 0, n[1], 0, m[2].length);    // copy row 3 to row 2
          System.arraycopy(m[0], 0, n[2], 0, m[0].length);    // copy row 1 to row 3
      
          System.out.println(Arrays.deepToString(m));
          System.out.println(Arrays.deepToString(n));
      }
      

      输出:

      [[3, 7], [4, 8], [5, 9]]
      [[4, 8], [5, 9], [3, 7]]
      

      【讨论】:

        【解决方案3】:

        可以使用实用方法Arrays.asList 将数组转换为列表,然后将方法Collections::rotate 应用于此列表以根据需要移动行。

        由于列表由初始数组备份,因此对列表的所有更改也将应用于此数组。

        例子:

        int [][] m = {{3,7},{4,8},{5,9}};
        System.out.println(Arrays.deepToString(m));
        Collections.rotate(Arrays.asList(m), -1);
        System.out.println(Arrays.deepToString(m));
        

        输出:

        [[3, 7], [4, 8], [5, 9]]
        [[4, 8], [5, 9], [3, 7]]
        

        如果这个解决方案对于家庭作业来说太先进了,实现向左旋转移位 1 的方法可能如下所示:

        public static void shiftLeftBy1(int[][] arr) {
            // copy the first row into another int[] array
            int[] copyRow = Arrays.copyOf(arr[0], arr[0].length);
        
            // shift the rows (no need to move each cell separately)
            for (int i = 0; i < arr.length - 1; i++) {
                arr[i] = arr[i + 1];
            }
        
            // set the last row to the first one
            arr[arr.length - 1] = copyRow;
        }
        

        【讨论】:

          猜你喜欢
          • 2014-02-15
          • 1970-01-01
          • 2023-04-11
          • 2017-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多