ورود

View Full Version : مشکل در کپی آرایه ای از String



Tiyana
چهارشنبه 06 فروردین 1393, 00:07 صبح
سلام من یه متد نوشتم که توی متد یه آرایه ی word رو که string هستش و فیلد کلاس هست توی یه آرایه ی temp میریزم اما مشکل اینجا که وقتی که temp رو تغییر میدم word هم تغییر میکنه !!!
کسی میدونه این مشکل برای چی بوجود میاد؟ ضمنا از arraylist هم نمیتونم استفاده کنم چون کل پروژه رو با String نوشتم....



public class Problem
{
private String[] word={"Ali","Ali","Mohammad"};
private int wcount=3;
public void filterDuplicateWord()
{
String[] temp=word;
for(int i=0;i<word.length;i++)
temp[i]=word[i];
int counter=0;
for(int i=0;i<wcount;i++)
{
for(int j=0;j<wcount;j++)
{
if(word[i].equals(word[j]))
{
if(i!=j)
{
temp[j]="0";
counter++;
}
}
}
}
System.out.println(word[1]);//Problem !??
}
}

vahid-p
چهارشنبه 06 فروردین 1393, 04:35 صبح
تمام اشیا در جاوا یک اشاره گر هستند ( شاید تعبیر خیلی دقیقی نباشه ). برای همین اونجایی که شما نوشتید :
String[] temp=word;
در اصل temp اشاره گریست به شی ء ای که word به اون اشاره میکنه. در نتیجه هر دو اشاره گر یا هر دو اسم به یک شی یکسان اشاره میکنند. و شی ماهیت و وجود دارد. حتی شما آرگومان های توابع، در اصل شی رو به تابع میدید برای همین هم توابعی مثل swap امکان پذیر نیست، چون نمیتوان جای دو شی را عوض کرد ( و شاید خیال کنیم اشاره گر ها رو عوض کردیم ). بگذریم.
اینجا کاری که شما باید بکنید برای اینکه با تغییر temp تغییری در word ایجاد نشود، باید ابتدا دو شی مجزا بسازید. و محتوا یا کاراکتر های شی اول را در شی دوم کپی کنید. خوشبختانه جاوا به فکر این موضوع بوده و برای بسیاری از کلاس ها چنین کانستراکتوری رو در نظر گرفته. در اینجا ما از کانستراکتور String(String original) استفاده میکنیم. به جای خطوط 7و8و9 اینا رو بنویس :
String temp[]=new String[word.length];
for(int i=0;i<word.length;i++){
temp[i]=new String(word[i]);
}

به تفاوت کد داخل حلقه دقت کن. در کد شما برابری استفاده شده و به یک شی اشاره میکنند ولی در این کد یک آبجکت جدید new شده. شما حتی بیاین و
String temp[]=new String[word.length];
for(int i=0;i<word.length;i++){
temp[i]=word[i];
}
بنویسین گرچه در خط اول با کد شما متفاوته ولی باز هر عنصر آرایه temp یک اشاره گر به عناصر معادل در word است. و در اصل شی جدیدی ساخته نشده و به همان شی های word فقط اشاره میکند.

Tiyana
چهارشنبه 06 فروردین 1393, 11:16 صبح
تمام اشیا در جاوا یک اشاره گر هستند ( شاید تعبیر خیلی دقیقی نباشه ). برای همین اونجایی که شما نوشتید :
String[] temp=word;
در اصل temp اشاره گریست به شی ء ای که word به اون اشاره میکنه. در نتیجه هر دو اشاره گر یا هر دو اسم به یک شی یکسان اشاره میکنند. و شی ماهیت و وجود دارد. حتی شما آرگومان های توابع، در اصل شی رو به تابع میدید برای همین هم توابعی مثل swap امکان پذیر نیست، چون نمیتوان جای دو شی را عوض کرد ( و شاید خیال کنیم اشاره گر ها رو عوض کردیم ). بگذریم.
اینجا کاری که شما باید بکنید برای اینکه با تغییر temp تغییری در word ایجاد نشود، باید ابتدا دو شی مجزا بسازید. و محتوا یا کاراکتر های شی اول را در شی دوم کپی کنید. خوشبختانه جاوا به فکر این موضوع بوده و برای بسیاری از کلاس ها چنین کانستراکتوری رو در نظر گرفته. در اینجا ما از کانستراکتور String(String original) استفاده میکنیم. به جای خطوط 7و8و9 اینا رو بنویس :
String temp[]=new String[word.length];
for(int i=0;i<word.length;i++){
temp[i]=new String(word[i]);
}

به تفاوت کد داخل حلقه دقت کن. در کد شما برابری استفاده شده و به یک شی اشاره میکنند ولی در این کد یک آبجکت جدید new شده. شما حتی بیاین و
String temp[]=new String[word.length];
for(int i=0;i<word.length;i++){
temp[i]=word[i];
}
بنویسین گرچه در خط اول با کد شما متفاوته ولی باز هر عنصر آرایه temp یک اشاره گر به عناصر معادل در word است. و در اصل شی جدیدی ساخته نشده و به همان شی های word فقط اشاره میکند.

خیلی خیلی ممنون دوست عزیز از جواب کاملی که دادید...:چشمک: