You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java二维矩阵列交换功能异常,输出结果不符合预期

问题分析与修复方案

嘿,我一眼就看出你代码里的问题了——核心是二维数组的浅拷贝坑加上交换时没有做值保护导致的覆盖。咱们一步步拆解:

为什么会出现重复值?

你用了int[][] swap = matrix.clone();来复制数组,但在Java里,二维数组本质是「数组的数组」,clone()只能拷贝外层数组的引用,内层的每一行数组还是和原数组matrix共享的。也就是说,swap[i]和matrix[i]指向的是同一个一维数组!

所以当你执行swap[i][c0] = matrix[i][c1];的时候,其实已经把matrix[i][c0]的值改成了matrix[i][c1]。接下来执行swap[i][c1] = matrix[i][c0];时,取到的matrix[i][c0]已经是刚修改后的matrix[i][c1]的值了,自然就出现了两行重复的结果。

两种修复方案

方案1:直接在原数组交换(推荐,更高效)

不需要额外的数组,用一个临时变量保存要交换的值,避免覆盖:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int row = scanner.nextInt();
        int column = scanner.nextInt();
        int[][] matrix = new int[row][column];
        
        // 读取矩阵数据
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                matrix[i][j] = scanner.nextInt();
            }
        }
        
        int c0 = scanner.nextInt();
        int c1 = scanner.nextInt();
        
        // 用临时变量交换两列,避免值覆盖
        for (int i = 0; i < row; i++) {
            int temp = matrix[i][c0];
            matrix[i][c0] = matrix[i][c1];
            matrix[i][c1] = temp;
        }
        
        // 输出结果
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                System.out.print(matrix[i][j] + " ");
            }
            System.out.println();
        }
    }
}

方案2:正确深拷贝数组(保留原数组的场景)

如果你需要保留原数组不被修改,就得对二维数组做深拷贝,也就是逐行复制每个元素:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int row = scanner.nextInt();
        int column = scanner.nextInt();
        int[][] matrix = new int[row][column];
        
        // 读取矩阵数据
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                matrix[i][j] = scanner.nextInt();
            }
        }
        
        // 正确深拷贝二维数组:逐行复制
        int[][] swap = new int[row][column];
        for (int i = 0; i < row; i++) {
            swap[i] = matrix[i].clone();
        }
        
        int c0 = scanner.nextInt();
        int c1 = scanner.nextInt();
        
        // 现在交换swap的列不会影响原matrix
        for (int i = 0; i < row; i++) {
            swap[i][c0] = matrix[i][c1];
            swap[i][c1] = matrix[i][c0];
        }
        
        // 输出结果
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                System.out.print(swap[i][j] + " ");
            }
            System.out.println();
        }
    }
}

关键知识点回顾

  • Java中二维数组的clone()是浅拷贝,只会复制外层数组引用,内层数组还是共享的
  • 交换两个变量/元素时,一定要用临时变量保存其中一个值,避免覆盖

内容的提问来源于stack exchange,提问作者Greta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:50:55