[問題]傳入物件的修改方式

看板java作者 (vencs)時間14年前 (2009/08/20 21:41), 編輯推噓3(3019)
留言22則, 6人參與, 最新討論串1/4 (看更多)
新手一枚,想請問一下板上的前輩問題 在練習程式的時候發現,若是將自行定義的類別物件傳入方法中時 似乎在方法中所做的修改沒有辦法對傳入的物件造成改變 想請問一下為什麼造成這種情形跟如何修改 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.119.135.18

08/20 22:05, , 1F
一定是你誤解了什麼,貼個 code 上來吧。
08/20 22:05, 1F
那這樣會是個有點長的故事  囧 在書上看過有題目寫 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)

08/20 23:06, , 2F
是QuickSortWork(objs, left, i - 1)出問題?
08/20 23:06, 2F

08/20 23:08, , 3F
第一輪的left=0, i=-1, 所以(0,-2) OutOfBounds
08/20 23:08, 3F

08/20 23:14, , 4F
迴圈內的i跟method內的i混在一起使用
08/20 23:14, 4F

08/20 23:19, , 5F
如果第一次交換的左原素就是objs[0]....
08/20 23:19, 5F

08/20 23:20, , 6F
元素交換完,指標還是指著那個位置
08/20 23:20, 6F

08/20 23:34, , 7F
跟指標沒有關係吧@@  我的確只是想要交換元素的內容
08/20 23:34, 7F
※ 編輯: vencil 來自: 140.119.135.18 (08/20 23:40)

08/21 00:39, , 8F
看出來了= ="int i = left - 1; 你看看你的LEFT是多少?
08/21 00:39, 8F

08/21 06:40, , 9F
那個沒有問題吧 下面剛開始的++i馬上就讓他回到0了不是嗎
08/21 06:40, 9F

08/21 10:47, , 10F
開debugger看是哪一句throw ex, 和當時各var 的狀態吧
08/21 10:47, 10F

08/21 11:31, , 11F
while(objs[++i].Compare(pivot) > 0);
08/21 11:31, 11F

08/21 11:33, , 12F
while(objs[--j].Compare(pivot) < 0);
08/21 11:33, 12F

08/21 11:49, , 13F
有無 ; 在語意上差很多
08/21 11:49, 13F

08/21 12:02, , 14F
逼自己在所有 if/while/for etc 都加上{} 就清楚多了
08/21 12:02, 14F

08/21 12:17, , 15F
前面幾樓的說法我有確認過 不是那種的語法問題@@
08/21 12:17, 15F

08/21 12:20, , 16F
還有我也想問提出來的修改物件的問題 希望有人幫忙解惑
08/21 12:20, 16F

08/21 12:27, , 17F
那你開 debugger trace 過沒有? 這種問題該很容易trace
08/21 12:27, 17F
請問debugger指的是javac的編譯問題說明嗎 如果是的我就貼一下他給的訊息 依序分別是 while(objs[++i].Compare(pivot) > 0) QuickSortWork(objs , 0, i); 發生問題  因為她第一個給的是Compare那行  所以有在想說是不是物件沒改到 ※ 編輯: vencil 來自: 140.119.135.18 (08/21 12:48)

08/21 14:40, , 18F
啥? 是連 compile 也不能過?!
08/21 14:40, 18F

08/21 14:48, , 19F
如果你覺得你寫的完全正確就不需要來問了.....
08/21 14:48, 19F

08/21 14:49, , 20F
明明就是你的演算法實做有誤...別人提點你都不聽...
08/21 14:49, 20F

08/21 14:55, , 21F

08/21 15:10, , 22F
順便一提... coding style 請跟 java 一般的比較好...
08/21 15:10, 22F
文章代碼(AID): #1AZLAXHU (java)
文章代碼(AID): #1AZLAXHU (java)