作者vencil (vencs)
看板java
标题[问题]传入物件的修改方式
时间Thu Aug 20 21:41:47 2009
新手一枚,想请问一下板上的前辈问题
在练习程式的时候发现,若是将自行定义的类别物件传入方法中时
似乎在方法中所做的修改没有办法对传入的物件造成改变
想请问一下为什麽造成这种情形跟如何修改
谢谢大家
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.119.135.18
1F:推 qrtt1:一定是你误解了什麽,贴个 code 上来吧。 08/20 22:05
那这样会是个有点长的故事 囧
在书上看过有题目写
private static Distance newDistance(Distance a){
a = new Distance(a.getD() - 1);
return a;
}
然後书中的答案是里面对a作的修改不会影响传进来的a
之前查网路有看到物件在方法中的调用不会对引用造成影响的解释,而我也这样接受
不过今天练习写BubbleSort跟QuickSort时写出来的结果让我感到有点疑惑
class sorting {
public static void BubbleSort(ICanCompare[] objs){
for(int i = objs.length - 1; i > 0; i--)
for(int j = 0; j < i; j++){
if(objs[j].Compare(objs[j+1]) > 0){
ICanCompare temp = objs[j];
objs[j] = objs[j+1];
objs[j+1] = temp;
}
}
}
//QuickSort part comtents two scope
public static void QuickSort(ICanCompare[] objs){
int i = objs.length -1;
QuickSortWork(objs , 0, i);
}
private static void QuickSortWork(ICanCompare[] objs, int left, int
right){
if(objs.length > 2){
ICanCompare pivot = objs[right];
int i = left - 1;
int j = right;
ShortLoop : for(;;){
while(objs[++i].Compare(pivot) > 0)
while(objs[--j].Compare(pivot) < 0)
if(i < j){
ICanCompare temp = objs[i];
objs[i] = objs[j];
objs[j] = temp;
}
else break ShortLoop;
}
ICanCompare temp = pivot;
pivot = objs[i];
objs[i] = temp;
QuickSortWork(objs, left, i - 1);
QuickSortWork(objs, i + 1, right);
}
}
}
BubbleSort能成功的排序,但是自己写的QuickSort却会出现ArrayIndexOutOfBounds-
Exception,所以我在怀疑是不是传进来的物件的问题
此外,原本还有写传进去物件的swap的方法
但是在无法交换成功之後就直接把程式码丢到每个要交换的地方
而这点也让我觉有点困惑,到底传进去的物件会不会被改到
所以想要发问物件在方法中的修改情形会是怎样
※ 编辑: vencil 来自: 140.119.135.18 (08/20 22:19)
2F:推 peicachu:是QuickSortWork(objs, left, i - 1)出问题? 08/20 23:06
3F:→ peicachu:第一轮的left=0, i=-1, 所以(0,-2) OutOfBounds 08/20 23:08
4F:→ peicachu:回圈内的i跟method内的i混在一起使用 08/20 23:14
5F:→ peicachu:如果第一次交换的左原素就是objs[0].... 08/20 23:19
6F:→ peicachu:元素交换完,指标还是指着那个位置 08/20 23:20
7F:→ vencil:跟指标没有关系吧@@ 我的确只是想要交换元素的内容 08/20 23:34
※ 编辑: vencil 来自: 140.119.135.18 (08/20 23:40)
8F:推 szss8765:看出来了= ="int i = left - 1; 你看看你的LEFT是多少? 08/21 00:39
9F:→ vencil:那个没有问题吧 下面刚开始的++i马上就让他回到0了不是吗 08/21 06:40
10F:→ adrianshum:开debugger看是哪一句throw ex, 和当时各var 的状态吧 08/21 10:47
11F:→ sbrhsieh:while(objs[++i].Compare(pivot) > 0); 08/21 11:31
12F:→ sbrhsieh:while(objs[--j].Compare(pivot) < 0); 08/21 11:33
13F:→ sbrhsieh:有无 ; 在语意上差很多 08/21 11:49
14F:→ adrianshum:逼自己在所有 if/while/for etc 都加上{} 就清楚多了 08/21 12:02
15F:→ vencil:前面几楼的说法我有确认过 不是那种的语法问题@@ 08/21 12:17
16F:→ vencil:还有我也想问提出来的修改物件的问题 希望有人帮忙解惑 08/21 12:20
17F:→ adrianshum:那你开 debugger trace 过没有? 这种问题该很容易trace 08/21 12:27
请问debugger指的是javac的编译问题说明吗
如果是的我就贴一下他给的讯息
依序分别是
while(objs[++i].Compare(pivot) > 0)
QuickSortWork(objs , 0, i);
发生问题 因为她第一个给的是Compare那行 所以有在想说是不是物件没改到
※ 编辑: vencil 来自: 140.119.135.18 (08/21 12:48)
18F:→ adrianshum:啥? 是连 compile 也不能过?! 08/21 14:40
19F:→ sbrhsieh:如果你觉得你写的完全正确就不需要来问了..... 08/21 14:48
20F:→ sbrhsieh:明明就是你的演算法实做有误...别人提点你都不听... 08/21 14:49
22F:→ adrianshum:顺便一提... coding style 请跟 java 一般的比较好... 08/21 15:10