看板 java 關於我們 聯絡資訊
新手一枚,想請問一下板上的前輩問題 在練習程式的時候發現,若是將自行定義的類別物件傳入方法中時 似乎在方法中所做的修改沒有辦法對傳入的物件造成改變 想請問一下為什麼造成這種情形跟如何修改 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.119.135.18
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)
peicachu:是QuickSortWork(objs, left, i - 1)出問題? 08/20 23:06
peicachu:第一輪的left=0, i=-1, 所以(0,-2) OutOfBounds 08/20 23:08
peicachu:迴圈內的i跟method內的i混在一起使用 08/20 23:14
peicachu:如果第一次交換的左原素就是objs[0].... 08/20 23:19
peicachu:元素交換完,指標還是指著那個位置 08/20 23:20
vencil:跟指標沒有關係吧@@  我的確只是想要交換元素的內容 08/20 23:34
※ 編輯: vencil 來自: 140.119.135.18 (08/20 23:40)
szss8765:看出來了= ="int i = left - 1; 你看看你的LEFT是多少? 08/21 00:39
vencil:那個沒有問題吧 下面剛開始的++i馬上就讓他回到0了不是嗎 08/21 06:40
adrianshum:開debugger看是哪一句throw ex, 和當時各var 的狀態吧 08/21 10:47
sbrhsieh:while(objs[++i].Compare(pivot) > 0); 08/21 11:31
sbrhsieh:while(objs[--j].Compare(pivot) < 0); 08/21 11:33
sbrhsieh:有無 ; 在語意上差很多 08/21 11:49
adrianshum:逼自己在所有 if/while/for etc 都加上{} 就清楚多了 08/21 12:02
vencil:前面幾樓的說法我有確認過 不是那種的語法問題@@ 08/21 12:17
vencil:還有我也想問提出來的修改物件的問題 希望有人幫忙解惑 08/21 12:20
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)
adrianshum:啥? 是連 compile 也不能過?! 08/21 14:40
sbrhsieh:如果你覺得你寫的完全正確就不需要來問了..... 08/21 14:48
sbrhsieh:明明就是你的演算法實做有誤...別人提點你都不聽... 08/21 14:49
sbrhsieh:http://tinyurl.com/nyrwn9 08/21 14:55
adrianshum:順便一提... coding style 請跟 java 一般的比較好... 08/21 15:10