黑马程序员技术交流社区
标题:
二维数行与列的互换问题
[打印本页]
作者:
施大勇
时间:
2013-9-23 16:38
标题:
二维数行与列的互换问题
本帖最后由 施大勇 于 2013-9-28 15:27 编辑
package lesson4;
/*
二维数组的行列互换直接在方法中实现产生一个新二维数组没有问题,为什么在方法中实现时返回的二维数组史记录了最后一次交换的结果 。
*/
public class Arrayhlhuhuan {
/**
* 二维数组的行列互换
*/
public static void main(String[] args) {
int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
sop(arr);
System.out.println("---------------------------------------------");
int [][]newarrs=huan(arr);
sop(newarrs);
}
private static void sop(int[][] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + "\t");
}
System.out.println();
}
}
private static int[][] huan(int[][] arr) {
int row = arr.length;//行数
int low = arr[0].length;//列数
int[][] newarrs = new int[low][row];//新建数组
int[] newarr = new int[row];//一维数组,容量为原数组的行数
for (int i = 0; i < low; i++) {//列循环
for (int j = 0; j < row; j++) {//行循环
int data = arr[j];
newarr[j] = data;//原数组每一列装入一维数组内。
}
newarrs=newarr;//一维数组作为一个元素放入二维数组内。
sop1(newarrs);
System.out.println();//测试二维数组装入的元数。
}
System.out.println("---------------------");
for (int i = 0; i < newarrs.length; i++) {
sop1(newarrs);
}
System.out.println("---------------------");
return newarrs; //返回交换后的数组
}
private static void sop1(int[] newarr) {
for (int i = 0; i < newarr.length; i++) {
System.out.print(newarr+"\t");
}
}
}
复制代码
作者:
黄文伯
时间:
2013-9-23 18:29
亲,如问题已解决请将分类的“未解决”改为“已解决”。 以后的问题贴也要及时更改分类哦~
作者:
晨曦
时间:
2013-9-24 21:36
行列互换为何会搞得这么麻烦,不就是一个a[i][j]换成a[j][i]么?
作者:
王清华0
时间:
2013-9-24 23:29
本帖最后由 王清华0 于 2013-9-24 23:30 编辑
问题出现在你这一句:
newarrs[i]=newarr;//一维数组作为一个元素放入二维数组内。
复制代码
数组是引用类型啊!!!
当你的newarr[0]=newarr的时候,你的newarrs[0]这个一维数组引用指向了newarr,下一次当你的newarr改变时,newarrs[0]也就变了。
同理,你后面的newarrs[1]和newarrs[2]这两个一维数组都指向了newarr,那么最终结果就是三行都变成了:369
只要将这个过程改成单独的数组内元素赋值就可以了。注意34行和35行
public class Arrayhlhuhuan {
/**
* 二维数组的行列互换
*/
public static void main(String[] args) {
int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
sop(arr);
System.out.println("---------------------------------------------");
int [][]newarrs=huan(arr);
sop(newarrs);
}
private static void sop(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();
}
}
private static int[][] huan(int[][] arr) {
int row = arr.length;//行数
int low = arr[0].length;//列数
int[][] newarrs = new int[low][row];//新建数组
int[] newarr = new int[row];//一维数组,容量为原数组的行数
for (int i = 0; i < low; i++) {//列循环
for (int j = 0; j < row; j++) {//行循环
int data = arr[j][i];
newarr[j] = data;//原数组每一列装入一维数组内。
}
//newarrs[i]=newarr;//一维数组作为一个元素放入二维数组内。
Tool.change(newarrs[i], newarr);
sop1(newarrs[i]);
System.out.println();//测试二维数组装入的元数。
}
System.out.println("---------------------");
for (int i = 0; i < newarrs.length; i++) {
sop1(newarrs[i]);
}
System.out.println("---------------------");
return newarrs; //返回交换后的数组
}
private static void sop1(int[] newarr) {
for (int i = 0; i < newarr.length; i++) {
System.out.print(newarr[i]+"\t");
}
}
}
class Tool
{
public static void change(int[] a,int[] b)
{
for(int i=0;i<b.length;i++)
{
a[i] = b[i];
}
}
}
复制代码
作者:
long362144768
时间:
2013-9-25 09:50
本帖最后由 long362144768 于 2013-9-28 20:04 编辑
你这个太复杂了,我给你简单的核心代码在这(限定二维数组是行列相等),主要是异或操作,异或操作是交换两个整形的最优方法,不需要开辟空间,效率也是比较好的。
for(int i = 0; i <n; i++)//n代表整数
for(int j=0 ; j <i; j++)
new[i][j]^=new[j][i];
new[j][i]^=new[i][j];
new[i][j]^=new[j][i];
复制代码
作者:
施大勇
时间:
2013-9-27 13:39
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();
}
}
}
上回蒙圈了,终于解快
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2