求教为什么不能转置。谢谢各位!

xiaosewu 2020-02-27 03:49:56
本小白财务出生,最近在自学java,刚学到数组部分,写了一个数组转置的方法 ,但输出的数组还是{7,6,5,4,3,2,1},代码如下,想请教一下哪里有问题。用同样的逻辑把sort方法直接写在主方法下运行结果又是正确的,代码如下面第二段代码,请教一下问题在哪里。自己实在想不通了。谢谢各位。
—————————————————————————————————————————————————————————
public class TestDemo{
public static void main(String args[]){
int data[]=new int[]{7,6,5,4,3,2,1};
ArryData.sort(data);
ArryData.tell(data);
}
}
class ArryData{
public static void sort(int[] arry){
int temp[]= new int[arry.length];
int foot=arry.length-1; //定义temp数组的角标
for(int x=0;x<arry.length;x++){
temp[foot]=arry[x];
foot = foot -1;
}
arry=temp;
}
public static void tell(int[] arry){
for(int x=0;x<arry.length;x++){
System.out.println(arry[x]);
}
}
}
—————————————————————————————————————————————————————————
public class TestDemo{
public static void main(String args[]){
int data[]=new int[]{7,6,5,4,3,2,1};
int temp[]= new int[data.length];
int foot=data.length-1; //定义temp数组的角标
for(int x=0;x<data.length;x++){
temp[foot]=data[x];
foot = foot -1;
}
data=temp;
ArryData.tell(data);
}
}
class ArryData{
public static void tell(int[] arry){
for(int x=0;x<arry.length;x++){
System.out.println(arry[x]);
}
}
}
...全文
465 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
luj_1768 2020-03-03
  • 打赏
  • 举报
回复
对象、数组、队列,可能都不会自动(或者缺省)支持赋值操作。就是说、那个赋值号背后执行的操作是什么,还是什么都没有做,谁也说不好。队列,有的编译器的实现,是支持拷贝操作的,可能应该使用Arryn.copy(); 要不,就应该使用遍历算法一项一项的赋值。
xiaosewu 2020-03-02
  • 打赏
  • 举报
回复
引用 10 楼 qq_39936465 的回复:
上图有点错误,arry是同一个
谢谢老师 🙏
  • 打赏
  • 举报
回复
sort方法里面应该加入return array的返回值,然后在main方法里面将是sort()方法的返回值赋值给data
qq_39936465 2020-02-28
  • 打赏
  • 举报
回复
上图有点错误,arry是同一个
qq_39936465 2020-02-28
  • 打赏
  • 举报
回复
引用 8 楼 xiaosewu 的回复:
老师您好!请问下ArryData.sort(data)这个方法的意思把data栈内存的地址给arry,让arry指向data的堆内存内容吗?所以我最后的arry=temp实际只是让arry指向了temp的堆内存内容,data还是指向data的堆内存内容,因为data指向的堆内存内容不变,所以输出结果不变。老师我这样理解对吗?
这是个很简单的问题,第一段你把最终值赋予了array,但是这个和你的main没有什么关系,你main中的data值根本没有改变,如果需要改变,请把方法加入返回值。看一下下图理解一下。
xiaosewu 2020-02-28
  • 打赏
  • 举报
回复
引用 10 楼 qq_39936465 的回复:
上图有点错误,arry是同一个
谢谢老师!
xiaosewu 2020-02-27
  • 打赏
  • 举报
回复
引用 7 楼 qybao 的回复:
ArryData.sort(data)这个data在main方法里,sort是不认识它的,只认识参数arry,方法调用时arry=data做了参数传递,所以arry和data指向了相同的堆内存,但是arry=temp就会改变arry的指向,使它指向temp的对内存,int temp[]= new int[arry.length]; temp的堆内存是另外new出来的,和data的堆内存不是同一个内存,所以arry=temp怎么能改变data指向的堆内存呢?
老师您好!请问下ArryData.sort(data)这个方法的意思把data栈内存的地址给arry,让arry指向data的堆内存内容吗?所以我最后的arry=temp实际只是让arry指向了temp的堆内存内容,data还是指向data的堆内存内容,因为data指向的堆内存内容不变,所以输出结果不变。老师我这样理解对吗?
qybao 2020-02-27
  • 打赏
  • 举报
回复
ArryData.sort(data)这个data在main方法里,sort是不认识它的,只认识参数arry,方法调用时arry=data做了参数传递,所以arry和data指向了相同的堆内存,但是arry=temp就会改变arry的指向,使它指向temp的对内存,int temp[]= new int[arry.length]; temp的堆内存是另外new出来的,和data的堆内存不是同一个内存,所以arry=temp怎么能改变data指向的堆内存呢?
xiaosewu 2020-02-27
  • 打赏
  • 举报
回复
引用 3 楼 paullbm 的回复:
楼上说的都很清楚了!
另外,还有一种方法解决你的问题,把你的sort函数可以简化成如下:

public static void sort(int[] arry) {
for (int i = 0; i < arry.length / 2; i++) {
int temp = arry[i];
arry[i] = arry[arry.length - i - 1];
arry[arry.length - i - 1] = temp;
}
}
谢谢老师 我自己想的思路也是按老师您这个逻辑来写的 没搞清楚这个是网课老师提供的一种思路 虽然他说不太好 我还是想学习一下 谢谢老师的回复
xiaosewu 2020-02-27
  • 打赏
  • 举报
回复
引用 1 楼 大榕树下的小梦想 的回复:
这么说不知道你明不明白。
变量data ---对应引用“new int[]{7,6,5,4,3,2,1}”

在你调用ArryData.sort(data)方法时候,你传入的实际上不是data这个东西,而是data对应的“引用new int[]{7,6,5,4,3,2,1}”。
而在这个方法里,可以改变“引用new int[]{7,6,5,4,3,2,1}”,但是不会改变 变量data 和 引用new int[]{7,6,5,4,3,2,1}的对应关系。
如果这个你能明白,后面就很好理解了。


首先,你新建了一个对象temp,并且将arry的倒叙{1,2,3,4,5,6,7}成功赋给了temp。重点来了:
你直接将arry=temp,这样子操作的解释是:
arry--对应的引用由“new int[]{7,6,5,4,3,2,1}”变成 “new int[]{1,2,3,4,5,6,7}”
而实际上你并没有改变“new int[]{7,6,5,4,3,2,1}”这个引用的内容。

所以,脱离了这个方法后,由于引用“new int[]{7,6,5,4,3,2,1}”没有改变,所以data值对应的还是“new int[]{7,6,5,4,3,2,1}”

解决方法就是在ArryData.sort(data)这个方法里对该引用进行操作即可。如下所示:
将arry = temp; 修改为
for (int x = 0; x < temp.length; x++) {
arry[x] = temp[x];
}
这样子就ok了。不懂可以回帖子
老师您好!我还是有点昏,我理解的是arry=temp执行后,就是把temp栈内存保存的地址赋予arry了,让arry也指向temp指向的堆内存内容,也就是{1,2,3,4,5,6,7},所以arry返回也应该是{1,2,3,4,5,6,7}。ArryData.sort(data)这个方法也是让data指向temp指向的堆内存内容。麻烦老师再指点一下我想法哪里有问题,因为不是科班出生,有点难理解。谢谢老师!🙏
xiaosewu 2020-02-27
  • 打赏
  • 举报
回复
老师您好!我还是有点昏,我理解的是arry=temp执行后,就是把temp栈内存保存的地址赋予arry了,让arry也指向temp指向的堆内存内容,也就是{1,2,3,4,5,6,7},所以arry返回也应该是{1,2,3,4,5,6,7}。ArryData.sort(data)这个方法也是让data指向temp指向的堆内存内容。麻烦老师再指点一下我哪里有问题,因为不是科班出生,有点难理解。谢谢老师!🙏
paullbm 2020-02-27
  • 打赏
  • 举报
回复
楼上说的都很清楚了!
另外,还有一种方法解决你的问题,把你的sort函数可以简化成如下:

public static void sort(int[] arry) {
for (int i = 0; i < arry.length / 2; i++) {
int temp = arry[i];
arry[i] = arry[arry.length - i - 1];
arry[arry.length - i - 1] = temp;
}
}


qybao 2020-02-27
  • 打赏
  • 举报
回复
class ArryData{
public static void sort(int[] arry){
int temp[]= new int[arry.length];
int foot=arry.length-1; //定义temp数组的角标
for(int x=0;x<arry.length;x++){
temp[foot]=arry[x];
foot = foot -1;
}
arry=temp;//你要明白arry和main方法的data是什么关系,data在main方法里(也就是作用域在main方法里),sort方法看不到data,它看到的arry之所以和data一样只是因为传参数的时候做了值传递arry=data,然而你在sort里重新给arry赋值了array=temp,也就是arry!=data了,只是改变了arry,并没有改变data
}

改成一下
class ArryData{
public static void sort(int[] arry){
int temp[]= new int[arry.length];
int foot=arry.length-1; //定义temp数组的角标
for(int x=0;x<arry.length;x++){
temp[foot]=arry[x];
foot = foot -1;
}
//arry=temp;
System.arraycopy(temp, 0, arry, 0, arry.length); //改成这样就可以了,因为arry=data没变,把temp复制给arry就是复制给data
}
懒惰の天真热 2020-02-27
  • 打赏
  • 举报
回复
这么说不知道你明不明白。
变量data ---对应引用“new int[]{7,6,5,4,3,2,1}”

在你调用ArryData.sort(data)方法时候,你传入的实际上不是data这个东西,而是data对应的“引用new int[]{7,6,5,4,3,2,1}”。
而在这个方法里,可以改变“引用new int[]{7,6,5,4,3,2,1}”,但是不会改变 变量data 和 引用new int[]{7,6,5,4,3,2,1}的对应关系。
如果这个你能明白,后面就很好理解了。


首先,你新建了一个对象temp,并且将arry的倒叙{1,2,3,4,5,6,7}成功赋给了temp。重点来了:
你直接将arry=temp,这样子操作的解释是:
arry--对应的引用由“new int[]{7,6,5,4,3,2,1}”变成 “new int[]{1,2,3,4,5,6,7}”
而实际上你并没有改变“new int[]{7,6,5,4,3,2,1}”这个引用的内容。

所以,脱离了这个方法后,由于引用“new int[]{7,6,5,4,3,2,1}”没有改变,所以data值对应的还是“new int[]{7,6,5,4,3,2,1}”

解决方法就是在ArryData.sort(data)这个方法里对该引用进行操作即可。如下所示:
将arry = temp; 修改为
for (int x = 0; x < temp.length; x++) {
arry[x] = temp[x];
}
这样子就ok了。不懂可以回帖子


62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧