İçeriğe geç
ShiftDelete.Net
Haber ara/ SDN'ye SorGiriş
Haber Akışı SDNTV İnceleme Forum Yapay Zeka Akıllı Telefon Elektrikli Otomobil Oyun ShiftDelete.Net Global Teknoloji Haberleri Mobil Otomobil Donanım Savunma Bilim Sosyal Medya İnternet Giyilebilir Teknoloji Rehber Ürünler Son dakika Yazarlar
  1. Ana sayfa
  2. Topluluk
  3. Programlama
  4. Programlama Dilleri
Programlama Dilleri

Java dizi kopyalama yardım

Champion7805.05.201112 cevap5.066 görüntüleme
2006'den beri1.716 mesaj
#1
Merhaba arkadaşlar, Java'da diziyi bir türlü kopyalayamıyorum. Daha doğrusu kopyalamada problem yok; ancak kopyaladığım dizinin birini değiştirince diğeri de değişiyor, bunu engellemenin bir yolu var mı?
şöyle ki:
dizi[3]=10;
yenidizi=dizi;
yenidizi[3]=20;

diyince dizi[3] de 20 oluyor :) bunu engelleyebilirsem çok güzel olacak :)
şimdiden teşekkürler :flowers:
Cevaplar
2007'den beri29 bin mesaj
#2
Valla çözümüm yok ama hayretimi gizleyemedim.

Çok ilginç..

java kurulu olsaydı da deneseydim keşke.
Champion78 Konuyu açan
2006'den beri1.716 mesaj
#3
:)) aslında problemim dizilerle değil (bilmiyorum belki diziler normal çalışıyordur), benim problemim ArrayList ile, yani dinamik diziler :) umarım bilen biri çıkar, Java'yı da pek bilmiyorum açıkçası :)
2009'den beri1.405 mesaj
#4
Neden öyle olduğu çok basit, dizinin bir kopyasını almıyorsun, ortada olan bir dizinin referansını almış oluyorsun. döngü içinde her bir elemanı tek tek kopyalaman gerekecek, ya da java da kopyasını çıkartan fonksiyonlar olması lazımdı. (Adı javacı olan bir bölümden mezunum ama c++ kastığım için unutmuşum, vay be :D )

---------- Post added at 22:38 ---------- Previous post was at 22:33 ----------

Google da Object_copy Copying_in_Java diye arat. Wiki sayfası falan da var konu ile ilgili. Programlama dillerinin ve bellek yönetimi ile ilgili güzel bilgiler içeriyor ;)
fonksiyon adı da .clone() diyorlar ama davranışı nasıl bilemiyorum.
2008'den beri174 mesaj
#5
Javayı pek bilmem ama Clone() diye bir fonksiyon varmı diye bi araştır ... yenidizi=dizi.Clone(); gibi

birde örnek var :

public static void main(String[] args) {
ArrayList list = new ArrayList();

for (int i = 0; i < 5; i++) {
list.add(new Int(i));
}
System.out.println("List is : " + list);

ArrayList list1 = (ArrayList) list.clone();

for (Iterator e = list1.iterator(); e.hasNext();) {
((Int) e.next()).increase();
}
System.out.println("List after cloning is: " + list);
}
Champion78 Konuyu açan
2006'den beri1.716 mesaj
#6
referans olarak aldığını biliyorum da işte bunu nasıl engellerim acaba :) şu an döngüyle kopyalıyorum ancak, ödevim gereği bu işlem recursive fonksiyon içerisinde tekrarlanıyor ve işlem derinliği arttıkça bu kopyalama işlemi muazzam seviyelere ulaşıyor. şöyle örnek vereyim derinliği 4 olarak ayarladığımda 190.000 kez çağrılıyor, eğer derinlik 5 olursa da, 3.922.254 kez çağrılıyor :D ayrıca aynı derinlik seviyesinde de giderek artma eğiliminde :)

clone() u bi araştırayım bakalım, teşekkürler :)
2009'den beri1.405 mesaj
#7
Sen bir dizinin kopyasını almak istediğinde ne yaparsan yap o arkaplanda doğrusal olarak recursive ya da iterative olarak tüm dizinin taramasını yapacak ve aynı algoritma karmaşıklığı tutacak ancak kullandığın fonksiyon 5 JVM clock cycle süresince yapar 3 cycle süresince yapar ona göre kopya çıkartma fonksiyonu çağırırsın.

Bu kadar döngüde ne kopyalatıyorlar ki? Bir mp3 ü byte byte kopyalamak ile aynı olay :D
2007'den beri2.589 mesaj
#8
Sonunda birisi java sordu :) heyecanla koştum :P

dizi1 = dizi2 dediğinde bu iki dizinin referanslarını bir birine eşitlediğin için birini değiştirince öteki de değişir. Burada kullanabileceğin metod System classının arraycopy metodudur.
public class arrayCopyTester {

	private int array1[];
	private int array2[];

	public arrayCopyTester() {
		// TODO Auto-generated constructor stub
		array1 = new int[10];
		array2 = new int[5];
	}

	public void insertToArray(int val, int pos) {
		if (pos < 10)
			array1[pos] = val;
		else
			System.out
					.println("invalid position try again with lesst then 10 for the position!");
	}

	public int[] getArray1() {
		return array1;
	}

	public void setArray1(int[] array1) {
		this.array1 = array1;
	}

	public int[] getArray2() {
		return array2;
	}

	public void setArray2(int[] array2) {
		this.array2 = array2;
	}

	public static void main(String[] args) {

		arrayCopyTester tester = new arrayCopyTester();
		for (int i = 0; i < 10; i++)
			tester.insertToArray(i + 19, i);

		System.arraycopy(tester.getArray1(), 0, tester.getArray2(), 0, 5);
		for (int i = 0; i < 5; i++)
			tester.getArray2()[i] = tester.getArray2()[i] + 100;

		for (int i = 0; i < 5; i++) {
			System.out.println("array 2 -> " + tester.getArray2()[i]);
			System.out.println("array 1 -> " + tester.getArray1()[i]);
		}
	}
}


burada ufak bir testter class'ı var. sen de editörünle bu kodu değiştirip. arraycopy metodunun kullanımı öğrenebilirsin.

Javadoc syntax'ı :

Static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

src : kopyalanacak kaynak array.
srcPos : kaynak kopyalama başlangıç indexi.
dest : hedef array.
destPos : hedef kopyalama başlangıç indexi.
length : kopyalacak eleman sayısı.

burada indexOutOfBoundsException'a dikkat etmen gerektiğini de hatırlatırım.
Champion78 Konuyu açan
2006'den beri1.716 mesaj
#9
annttiigs dedi: ↑
Sonunda birisi java sordu :) heyecanla koştum :P

dizi1 = dizi2 dediğinde bu iki dizinin referanslarını bir birine eşitlediğin için birini değiştirince öteki de değişir. Burada kullanabileceğin metod System classının arraycopy metodudur.
arraylist için olanı var mı peki :) bu arada clone işe yaramadı :(
2007'den beri2.589 mesaj
#10
clone metodu "shallow copy" yapar. yani a = b demekle aynı şeydir. referansları kopyalar. Senin yapabileceğin şey yeni bir listeye ötekini tekrardan yazmaktır. ( deep copy )
 
ArrayList hedef= new ArrayList();
for (Object obj : kaynak)
   hedef.add(obj.clone());
Champion78 Konuyu açan
2006'den beri1.716 mesaj
#11
anlaşılan eski şekilde yapmaya devam :) dua edeyim de 4. seviye derinlik yetsin bari :D
2009'den beri1.405 mesaj
#12
Okul neresi? Veriyapıları ödevi gibi sanki??
Champion78 Konuyu açan
2006'den beri1.716 mesaj
#13
çanakkale 18 mart, yapay zeka ödevi ;) hexagon diye bir oyun var onu yapmaya çalışıyoruz. yaptım da işte anca 4 adım öteyi görebiliyor. daha fazlasını düşünmesi çok uzun sürüyor..

Cevabını yaz

Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.