作者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