چرا مقدار متغیر حفظ نمی شه
سلام
این یه تابعه که می خواد تعداد عناصری که توی یک آرایه به ترتیب بر عکس قرار دارند را پیدا کنه. حالا هدفش خیلی مهم نیست. لطفا این کد رو ببینین:
private void findInversions(int begin, int end, int count) {
if (end - begin < 1)
return;
int middle = (begin + end) / 2;
findInversions(begin, middle, count);
System.out.println("count: " + count + " CHERA????");
findInversions(middle + 1, end, count);
count = mergeAndCount(begin, middle, end, count);
}
private int mergeAndCount(int begin, int middle, int end, int count) {
int[] result = new int[end - begin + 1];
int aptr = begin;
int bptr = middle + 1;
for (int i = 0; i < result.length; i++) {
if (aptr <= middle && bptr <= end) {
if (numbers[aptr] < numbers[bptr]) {
result[i] = numbers[aptr];
aptr++;
}
else {
// (a[aptr], b[bptr]) is an inversion here
count++;
System.out.println("PAYDA SHOD: (" + numbers[aptr] + "," + numbers[bptr] + "). VALI COUNT MEGHDARESH GHALATE: " + count);
result[i] = numbers[bptr];
bptr++;
}
}
else if (aptr > middle) {
result[i] = numbers[bptr];
bptr++;
}
else if (bptr > end) {
result[i] = numbers[aptr];
aptr++;
}
}
for (int i = 0; i < result.length; i++) {
numbers[begin + i] = result[i];
}
return count;
}
من هم خود count رو به عنوان آرگومان پاس می دم و هم returnش می کنم. با توجه به این که جاوا خود اصل متغیر رو تغییر می ده (مگه نه؟) چرا مقدار count وقتی از اجراهای مختلف تابع بازگشتی بیرون می یایم همون مقدار قبلیشه و تغییر نکرده؟
ممنون
ویرایش: دوستان من از یکی از دوستام سوال کردم و ظاهرا اشتباه می کردم و int چون primitiveه کپی می شه و اصلش عوض نمی شه. ولی من نوع count رو به Integer هم تغییر دادم درست نشد. لطفا راهنمایی کنین.
نقل قول: چرا مقدار متغیر حفظ نمی شه
در جاوا دو نوع Call-by-reference و Call-by-value داریم. مورد اول int چون primitive است از call-by-value استفاده میشه.
مورد دوم چون object است از Call-by-reference استفاده میشه. اما چون آبجکت Integer, String,... از نوع immutable هستند، شما نمیتونید محتوای آبجکت رو تغییر بدید، بلکه با هر تغییر آبجکت جدیدی ساخته میشه و اون آبجکت اولی نیست.
البته این که داخل یک متد، یک آبجکت پارامتر رو هم Assign کنید (x=...) چه immutable باشه چه mutable تفاوتی نداره و آبجکت اول تغییر نمیکنه. در صورتی که آبجکت شما mutable باشه و بتونید فیلدهای اون رو تغییر بدید مثل setValue(...) اونموقع آبجکت جدیدی ساخته نمیشه و آبجکت اولیتون تغییر میکنه.
شما این مفاهیمی که گفته شد رو تو اینترنت سرچ بزنید، اگر مفهوم نبود بگید تا با رسم شکل توضیح بدم، قابل فهمتره
اینم یه مثال:
public static void main(String[] args) {
Integer x=1,y=2;
System.out.println("X="+x+", Y="+y);
swap(x,y);
System.out.println("X="+x+", Y="+y);
}
public static void swap(Integer first,Integer second){
Integer temp=first;
first=second;
second=temp;
}
خروجی:
X=1, Y=2
X=1, Y=2