01/10/2018, 17:33
Hỏi về truyền mảng vào phương thức trong java
Em có đoạn code như thế này
Em muốn thêm con n vào vị trí pos trong mảng a. Trong main em gọi hàm xuất ra thì không thay đổi cho em hỏi code em sai chỗ nào.
hàm này nằm chung với class chứa main.
public static void addElement(int a[],int pos,int n)
{
// 1 2 3 4 5
// 1 2 3 6 4 5
// tao 1 mang b có kích thước là n+1
int b[] = new int [a.length+1];
// chuyen gia tri sang mang b
for(int i = 0 ; i < a.length ; i ++)
b[i] = a[i];
for(int i = b.length-1 ; i > pos ; i--)
b[i] = b[i-1];
b[pos] = n;
// delete mang a
a = new int [b.length];
for(int i = 0 ; i < b.length; i++)
a[i] = b[i];
}
Bài liên quan
java nó khác C/C++ nha bạn, mình chưa test, nhưng mà mình nghĩ là tại vì ở hàm main khi bạn truyền mảng vào phương thức, thì tại đây nó sẽ tạo 1 mảng mới và gán các giá trị của mảng bạn định truyền vào.
Tức là tại đây thay vì nó lấy cái mảng bạn muốn chỉnh sửa thì nó lại tạo 1 mảng mới y chang cái mảng của bạn. Hai cái mảng này giống nhau ngoại trừ cái tham chiếu của nó thì khác nhau thôi, giống như bạn có 2 con trỏ trong C/C++, mỗi con trỏ nó lại trỏ đến 1 cái mảng khác nhau dù rằng 2 cái mảng này có giá trị bằng nhau.
Nên trong phương thức của bạn, cái mảng bạn chỉnh sửa không có dính dáng gì đến cái mảng bên ngoài hàm main cả, cái mảng trong phương thức bạn đã sửa đổi, nhưng ở ngoài thì vẫn còn y nguyên.
Cần gì làm thế. Chỉ cần:
Thay vì trả về
void
thì nên trả vềint[]
Khi đó có thể gán trở lại
a
sau khi thêm.a = b Mình mới biết cái này chắc giống con trỏ bên C. Mình đã test thử và code chạy thành công, nhưng có 1 thắc mắc là khi mình truyền mảng vào không có cách nào thay đổi trực tiếp thay vì phải trả về.
Đối với C# thì có từ khóa
ref
cho phép thay đổi giá trị con trỏ. Java thì không.Tuy nhiên có 1 cách là dùng đối tượng chứa mảng.
Mình có đoạn code như thế này, bỏ vào phương thức thì nó thay đổi được mảng.
Ở đây bạn truyền vào một biến cục bộ, nên ở đây sẽ là
Pass by Vaule
, tức là nó chỉ nhận giá trị của mảng chứ không phải là con trỏ chỉ đến mảng.Có 2 cách để bạn giải quyết việc này
Pass by Reference
. Nhưng ở đây vì bạn viết ở 2 Class khác nhau nên sẽ khác là phức tạp đấy, chuyển sang cách 2 sẽ nhanh hơnvoid qsort
trả vềchar[]
đã sắp xếpMình sẽ giải thích chương trình mình trước thì sau khi nhập giá trị xong, mình sẽ sắp xếp bằng method bubbleSort() => chương trình chạy và sắp xếp được. Tuy nhiên với addElement method => chương trình không hoạt động và in ra kêt quả như bình thường. Vậy thì nguyên nhân là do gì?
Mình nói ở trên rồi mà =_= Bạn đang truyền vào mảng
a
là một biến cục bộ chứ không phải biến toàn cục, vậy nên nó sẽ làPass by Vaule
chứ không phải làPass by Reference
. Vì vậy mà bạn thay đổi giá trị ở trong các void thì giá trị ở mảng a vẫn sẽ không thay đổiWhat's the difference between passing by reference vs. passing by value?
Nhưng bubbleSort method của mình lại thay đổi và sắp xếp tăng dần được ý?
Vì đảo giá trị phần tử chứ đâu phải tạo mới (new int[]). Khác đấy.