A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 施大勇 中级黑马   /  2013-9-23 16:38  /  2220 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 施大勇 于 2013-9-28 15:27 编辑

  1. package lesson4;
  2. /*
  3. 二维数组的行列互换直接在方法中实现产生一个新二维数组没有问题,为什么在方法中实现时返回的二维数组史记录了最后一次交换的结果 。
  4. */
  5. public class Arrayhlhuhuan {

  6.         /**
  7.          * 二维数组的行列互换
  8.          */
  9.         public static void main(String[] args) {
  10.                 int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
  11.                 sop(arr);
  12.                 System.out.println("---------------------------------------------");
  13.                 int [][]newarrs=huan(arr);
  14.                 sop(newarrs);
  15.         }

  16.         private static void sop(int[][] arr) {
  17.                 for (int i = 0; i < arr.length; i++) {
  18.                         for (int j = 0; j < arr.length; j++) {
  19.                                 System.out.print(arr[j] + "\t");
  20.                         }
  21.                         System.out.println();
  22.                 }
  23.                
  24.         }

  25.         private static int[][] huan(int[][] arr) {
  26.                 int row = arr.length;//行数
  27.                 int low = arr[0].length;//列数
  28.                 int[][] newarrs = new int[low][row];//新建数组
  29.                 int[] newarr = new int[row];//一维数组,容量为原数组的行数
  30.                 for (int i = 0; i < low; i++) {//列循环
  31.                         for (int j = 0; j < row; j++) {//行循环
  32.                                 int data = arr[j];
  33.                                 newarr[j] = data;//原数组每一列装入一维数组内。

  34.                         }
  35.                         newarrs=newarr;//一维数组作为一个元素放入二维数组内。
  36.                         sop1(newarrs);
  37.                         System.out.println();//测试二维数组装入的元数。

  38.                 }
  39.                 System.out.println("---------------------");
  40.                 for (int i = 0; i < newarrs.length; i++) {
  41.                         sop1(newarrs);
  42.                 }
  43.                 System.out.println("---------------------");
  44.                 return newarrs; //返回交换后的数组
  45.         }

  46.         private static void sop1(int[] newarr) {
  47.                 for (int i = 0; i < newarr.length; i++) {
  48.                         System.out.print(newarr+"\t");
  49.                 }
  50.         }

  51. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1 很给力!

查看全部评分

5 个回复

倒序浏览
亲,如问题已解决请将分类的“未解决”改为“已解决”。 以后的问题贴也要及时更改分类哦~
回复 使用道具 举报
行列互换为何会搞得这么麻烦,不就是一个a[i][j]换成a[j][i]么?
回复 使用道具 举报
本帖最后由 王清华0 于 2013-9-24 23:30 编辑

问题出现在你这一句:
  1. newarrs[i]=newarr;//一维数组作为一个元素放入二维数组内。
复制代码
数组是引用类型啊!!!
当你的newarr[0]=newarr的时候,你的newarrs[0]这个一维数组引用指向了newarr,下一次当你的newarr改变时,newarrs[0]也就变了。
同理,你后面的newarrs[1]和newarrs[2]这两个一维数组都指向了newarr,那么最终结果就是三行都变成了:369
只要将这个过程改成单独的数组内元素赋值就可以了。注意34行和35行
  1. public class Arrayhlhuhuan {
  2.     /**
  3.      * 二维数组的行列互换
  4.      */
  5.     public static void main(String[] args) {
  6.             int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
  7.             sop(arr);
  8.             System.out.println("---------------------------------------------");
  9.             int [][]newarrs=huan(arr);
  10.             sop(newarrs);
  11.     }

  12.     private static void sop(int[][] arr) {
  13.             for (int i = 0; i < arr.length; i++) {
  14.                     for (int j = 0; j < arr[i].length; j++) {
  15.                             System.out.print(arr[i][j] + "\t");
  16.                     }
  17.                     System.out.println();
  18.             }
  19.             
  20.     }

  21.     private static int[][] huan(int[][] arr) {
  22.             int row = arr.length;//行数
  23.             int low = arr[0].length;//列数
  24.             int[][] newarrs = new int[low][row];//新建数组
  25.             int[] newarr = new int[row];//一维数组,容量为原数组的行数
  26.             for (int i = 0; i < low; i++) {//列循环
  27.                     for (int j = 0; j < row; j++) {//行循环
  28.                             int data = arr[j][i];
  29.                             newarr[j] = data;//原数组每一列装入一维数组内。

  30.                     }
  31.                     //newarrs[i]=newarr;//一维数组作为一个元素放入二维数组内。
  32.                     Tool.change(newarrs[i], newarr);
  33.                     sop1(newarrs[i]);
  34.                     System.out.println();//测试二维数组装入的元数。

  35.             }
  36.             System.out.println("---------------------");
  37.             for (int i = 0; i < newarrs.length; i++) {
  38.                     sop1(newarrs[i]);
  39.             }
  40.             System.out.println("---------------------");
  41.             return newarrs; //返回交换后的数组
  42.     }

  43.     private static void sop1(int[] newarr) {
  44.             for (int i = 0; i < newarr.length; i++) {
  45.                     System.out.print(newarr[i]+"\t");
  46.             }
  47.     }
  48. }

  49. class Tool
  50. {
  51.         public static void change(int[] a,int[] b)
  52.         {
  53.                 for(int i=0;i<b.length;i++)
  54.                 {
  55.                         a[i] = b[i];
  56.                 }
  57.         }
  58. }
复制代码

评分

参与人数 1黑马币 +15 收起 理由
黄文伯 + 15 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 long362144768 于 2013-9-28 20:04 编辑

你这个太复杂了,我给你简单的核心代码在这(限定二维数组是行列相等),主要是异或操作,异或操作是交换两个整形的最优方法,不需要开辟空间,效率也是比较好的。
  1. for(int i = 0; i <n; i++)//n代表整数
  2.     for(int j=0 ; j <i; j++)
  3.         new[i][j]^=new[j][i];
  4.         new[j][i]^=new[i][j];
  5.         new[i][j]^=new[j][i];
复制代码

评分

参与人数 1技术分 +1 黑马币 +12 收起 理由
黄文伯 + 1 + 12 赞一个!

查看全部评分

回复 使用道具 举报
package lesson5;

public class xt4 {

       
        public static void main(String[] args) {
                int [][]arr={{1,2,3},{4,5,6},{7,8,9}};
                System.out.println("原数组的内容:");
                printArray(arr);
               
                int [][]newarr=huanhl(arr);
                System.out.println("行列交换后的数组:");
                printArray(newarr);
        }

        private static int[][] huanhl(int[][] arr) {
                int x=arr.length;
                int y=arr[0].length;
                int newarr[][]=new int [y][x];
               
                for (int i=0;i<y;i++){
                        for (int j=0;j<x;j++){
                                int num=arr[j][i];//取每一列,行变,列不变。
                                newarr[i][j]=num;//行不变,列变,装入行。
                        }
                }
                return newarr;
        }

        private static void printArray(int[][] arr) {
                /*for (int i=0;i<arr.length;i++){
                        for (int j=0;j<arr[i].length;j++){
                                System.out.print(arr[i][j]+"\t");
                        }
                        System.out.println();
                }*/
               
                for (int[] is : arr) {
                        for (int  i : is) {
                                System.out.print(i+"\t");
                        }
                        System.out.println();
                }
        }

}
上回蒙圈了,终于解快

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马