import java.util.*;

public class JB_030_ArrayList {

	public static void main(String[] args) {
		
		String ayrac = "====================";
		
		System.out.println(ayrac);
		
		ArrayList<Double> ortalamalar = new ArrayList<Double>();  	// double ArrayList tanimlama
		
		ortalamalar.add(0.45);
		ortalamalar.add(0.87);
		ortalamalar.add(0.66);
		ortalamalar.add(0.23);
		ortalamalar.add(0.11);
		ortalamalar.add(0.94);
		ortalamalar.add(0.23);
		ortalamalar.add(0.23);
		
		System.out.println("Ortalama degerler : " + ortalamalar);
		
		System.out.println(ayrac);
		
		
		
		// ArrayList'leri yazdirma yöntemleri :
		
		System.out.println("1. Dogrudan yazdirma");
		System.out.println("Ortalama degerler : " + ortalamalar);  // Dogrudan yazdirma sekli
		System.out.println(ayrac);
		
		System.out.println("2. for() ile yazdirma");
		
		for(int i = 0; i < ortalamalar.size(); i++){	// for() dönguusü ile yazdirma sekli
		    System.out.println("eleman : "+ortalamalar.get(i));
		}
		System.out.println(ayrac);
		
		System.out.println("3. forEach() ile yazdirma"); 
		
		
		ortalamalar.forEach((i) -> {	// forEach() ile yazdirma
		    System.out.println(i);
		});
		System.out.println(ayrac);
		
		System.out.println("4. for( Referans : ArrayList_name ) ile yazdirma");  
		
		// for(Object i : ortalamalar) {}
		
		for(double i : ortalamalar){ 	// Referans kullanarak yazdirma. 
										// Burada ortalamalar ArrayList'inin her bir elemanini i'ye referansliyoruz.
		    System.out.println(i);
		}
		System.out.println(ayrac);
		
		System.out.println("5. forEachRemaining() ile yazdirma:"); // 5 inci yöntem.
		
		Iterator<Double> yinele = ortalamalar.iterator();  
        yinele.forEachRemaining( aktarici -> {
        	System.out.println(aktarici); 
        });  
        System.out.println(ayrac);
		
		
		// Integer ArrayList tanimlama ve add() ile eleman ekleme

		ArrayList<Integer> sicaklikOcak = new ArrayList<Integer>();
		
		sicaklikOcak.add(12);
		sicaklikOcak.add(13);
		sicaklikOcak.add(37);
		
		for(int gun : sicaklikOcak) {
			System.out.println("Ocak ayi sicaklik : " + gun);
		}
		
		System.out.println(ayrac);
		
		
		
		// listeye 3 ekleme daha yapiyoruz.
		
		sicaklikOcak.add(23);
		sicaklikOcak.add(2);
		sicaklikOcak.add(17);
		
		for(int gun : sicaklikOcak) {
			System.out.println("Ocak ayi sicaklik : " + gun + " -> " + sicaklikOcak.indexOf(gun));
		}
		
		System.out.println(ayrac);
		
		
		
		
		// tüm listeyi yazdiriyoruz 
		
		System.out.print("Liste yazdiriliyor: ");
		
		System.out.println(sicaklikOcak);
		
		System.out.println(ayrac);
		
		
		
		// index 'i belli bir elemani yazdiriyoruz
		
		System.out.println(".get(x); kullanimi.\nindex : 3 olan eleman -> " + sicaklikOcak.get(3));
		
		System.out.println(ayrac);
		
		
		
		// ArrayList 'e ArrayList ekliyoruz.
		
		ArrayList<Integer> sicaklikSubat = new ArrayList<Integer>();
		
		sicaklikSubat.add(-12);
		sicaklikSubat.add(-13);
		sicaklikSubat.add(-37);
		sicaklikSubat.add(-12);
		sicaklikSubat.add(-13);
		
		sicaklikSubat.addAll(sicaklikOcak);
		
		System.out.println(".addAll(ArrayList_name); kullanimi.\nSubat listesi : " + sicaklikSubat);
		
		System.out.println(ayrac);
		
		// .isEmpty() metodu listenin içi doluysa false bos ise true döndürür.
		
		boolean ocakTF = sicaklikOcak.isEmpty();
		
		System.out.println(".isEmpty(); kullanimi.\nOcak listesi bos mu? => " + ocakTF);
		
		System.out.println(ayrac);
		
		
		
		// remove(2); ArrayList içinde index'i 2 olan elemani siler 
		
		System.out.println(".romove(2); kullanimi.\nSubat listesi : " + sicaklikSubat);
		
		sicaklikSubat.remove(2);
		
		System.out.println("Subat listesi : " + sicaklikSubat);
		
		System.out.println(ayrac);
		
		
		
		// listeden bazi verileri silelim.
		
		System.out.println(sicaklikOcak + " -> asagida : index 3 ve 4 silinecek!!!");
		
		sicaklikOcak.remove(3);	// index; i 3 olan 23 sayisi siliniyor...
		sicaklikOcak.remove(4);	// DIKKAT!!! 2 simdi 3 üncü indexe kaydi. 17 silinecek!!! 17 de 4'e kaydi...
		
		for(int gun : sicaklikOcak) {
			System.out.println("Ocak ayi sicaklik : " + gun + " -> " + sicaklikOcak.indexOf(gun));
		}
		
		System.out.println(ayrac);
		
		
		
		// contains() metodu. Belirtilen deger varsa true döndürür.
		
		boolean varYok = sicaklikOcak.contains(35);
		
		System.out.println(".contains(eleman); kullanimi.");
		
		if (varYok) {
			System.out.println("35 sayisi Ocak sicaklik degerlerinde vardir.");
		} else {
			System.out.println("35 sayisi Ocak sicaklik degerlerinde yoktur.");
		}
		
		System.out.println(ayrac);
		
		
		
		// size() eleman soyisini verir.
		
		int elemanSayisi = sicaklikOcak.size();
		System.out.println(".size(); kullanimi.\nArrayList eleman sayisi = " + elemanSayisi);
		
		
		System.out.println(ayrac);
		
		
		
		// clear() ArrayList içini bosaltir.
		
		sicaklikOcak.clear();
		elemanSayisi = sicaklikOcak.size();
		System.out.println(".clear(); kullanimi.\nArrayList eleman sayisi = " + elemanSayisi);
		
		System.out.println(ayrac);
		
		
		
		// ArrayList'e index sayisi vererek eleman ekleme.
		
		ArrayList<String> renk = new ArrayList<String>();
		renk.add("Kirmizi");
		renk.add("Kahverengi");
		renk.add("Sari");
		renk.add("Yesil");
		renk.add("Turkuaz");
		renk.add("Mavi");
		renk.add("Mor");
		
		System.out.println(".add(x, eleman); kullanimi.\nRenkler listesi : " + renk);
		
		renk.add(4, "Gülkurusu");
		
		System.out.println("Renkler listesi : " + renk);
		
		System.out.println(ayrac);
		
		
		
		// .indexOf(); kullanimi
		
		int gks = renk.indexOf("Gülkurusu");
		
		System.out.println(".indexOf(eleman); kullanimi.\nGülkurusu : " + gks);
		
		System.out.println("Renkler listesi : " + renk);
		
		System.out.println(ayrac);
		
		
		
		//
		
		// .set(); kullanimi. 
		
		System.out.println(".set(x, eleman); kullanimi.\nRenkler listesi : " + renk);
		
		renk.set(4, "Turuncu");  // index 4 teki elemani siler yerine "Turuncu" ekler.		
		
		System.out.println("Renkler listesi : " + renk);
		
		System.out.println(ayrac);
		
		
		
		// .lastIndexOf();
		
		renk.add(3, "Turuncu");
		renk.add(5, "Turuncu");
		renk.add(7, "Turuncu");
		
		System.out.println(".lastIndexOf(); kullanimi.");
		System.out.println("Renkler listesi : "+renk);
		System.out.println(renk.lastIndexOf("Turuncu"));
		System.out.println(renk.lastIndexOf("Fistikyesili"));

		System.out.println(ayrac);
		
		
		
		// renk ArrayList'ini iterator ve while() ile yazdirma
		
		System.out.println("Iterator ile ArrayList yazdirma.");
		
		Iterator<String> renkITR = renk.iterator();	//Iterator'ü açiyoruz.  
		
		while(renkITR.hasNext()) {	//iterator'de eleman var mi kontrol ediyoruz : true/false  
			
			System.out.println(renkITR.next());	//elemani yazdirip bir sonraki eleman'a geçiyoruz.  
			
		} 
		
		System.out.println(ayrac);
		
		
		
		// .sort() ile ArrayList'i siralama.
		
		System.out.println("sicaklikSubat ArrayList'ini harf sirasna sokuyoruz.");
		Collections.sort(sicaklikSubat);  

		for(int sicaklik : sicaklikSubat) {
			System.out.println(sicaklik);
		}
		
		System.out.println(ayrac);
		
		
		
		// .sort() ile ArrayList'i siralama.
		
		System.out.println("renk ArrayList'ini harf sirasna sokuyoruz.");
		Collections.sort(renk);  

		for(String boya : renk) {
			System.out.println(boya);
		}
		
		System.out.println(ayrac);
		
		
		
		// Musteri isminde bir class olusturup içine musteri bilgisi ekleyelim.
		// Asagidaki class Musteri() sinifini ekliyoruz önce.
		
		Musteri m1 = new Musteri("Hüsamettin", "Derici");
		Musteri m2 = new Musteri("Perihan", "Kepenkci");
		Musteri m3 = new Musteri("Sezen", "Aksu");
		Musteri m4 = new Musteri("Tom", "Cruise");
		Musteri m5 = new Musteri("Alex", "De Souza");
		
		ArrayList<Musteri> musteriListesi = new ArrayList<Musteri>();
		
		musteriListesi.add(m1);
		musteriListesi.add(m2);
		musteriListesi.add(m3);
		musteriListesi.add(m4);
		musteriListesi.add(m5);
		
		for (Musteri musteri : musteriListesi) {
			System.out.println(musteriListesi.indexOf(musteri) +" -> "+ musteri.AdSoyad());
		}
		
		
		
		// ArrayListten eleman silmek için : 
		
		musteriListesi.remove(m3);  // Sezen Aksu silinecek.
		
		for (Musteri musteri : musteriListesi) {
			System.out.println(musteriListesi.indexOf(musteri) +" -> "+ musteri.AdSoyad());
		}
		
		System.out.println(ayrac);
		
		
		// Character ArrayList örnegi...
		
		ArrayList<Character> harf = new ArrayList<Character>();
		
		harf.add('S');
		harf.add('e');
		harf.add('u');
		harf.add('f');
		harf.add('V');
		harf.add('U');
		harf.add('p');
		harf.add('5');
		
		System.out.println("harf ArrayList elemanlari = "+harf);
		
		System.out.println(ayrac);
		
		
		
		
		//ArrayList 'ler birbirine eklenmek için ayni türde olmalidir
		
		//sicaklikSubat.addAll(ortalamalar); // Bu hata verir!!!
		
		ArrayList<Object> hepsi = new ArrayList<Object>();  // farklilarsa Object kullanarak ekleriz.
		
		hepsi.addAll(ortalamalar);
		hepsi.addAll(sicaklikOcak);
		hepsi.addAll(renk);
		hepsi.addAll(harf);
	//	hepsi.addAll(musteriListesi);  // ?
		
		System.out.println("hepsi ArrayList elemanlari :\n" + hepsi);
		
		System.out.println(ayrac);
		
		
		
		
		// ArrayList referans tipi belirtmeden liste olusturma
		
		ArrayList madde = new ArrayList();
		
		madde.add('R');
		madde.add(3.465);
		madde.add(9);
		madde.add("Istanbul");
	//	madde.add(m5);  // ?
		
		System.out.println("ArrayList madde elemanlari = " + madde);
		
		
		System.out.println(ayrac);
		
		
		
		
		
		// List ile çalismak istersek.
		
		List<Integer> tamsayi = new ArrayList<>(); // ArrayList olusturduk.
		
		tamsayi.add(3);		// 0
		tamsayi.add(4); 	// 1	
		tamsayi.add(6);		// 2
		tamsayi.add(66);	// 3
		tamsayi.add(58);	// 4
		tamsayi.add(88);	// 5
		tamsayi.add(5, 2); 	// 5. index 'e 2 atamasi yaptik ve 88 6. index oldu.
		tamsayi.add(45);	// 7
		tamsayi.add(1, 0);	// 1. index 'e 0 atamasi yaptik ve 88 7. index oldu 2 6. index oldu.
		
		System.out.println("tamsayi List'indeki elemanlar : " + tamsayi);
		
		
		System.out.println(ayrac);
		
		
	}

}

class Musteri{
	
	String ad;
	String soyad;
	
	Musteri(String ad,String soyad)
	{
		this.ad=ad;
		this.soyad=soyad;
	}
	
	public String AdSoyad()  // AdSoyad 'i aliyoruz return ile.
	{
		return ad+" "+soyad;
	}
}
