1 Ocak 2021

Java Collections / Map Interface

ile gökhan

Java’da bir diğer veri saklama yöntemi Map Interface sınıfının kullanımıdır. Bu sınıflarda veriler anahtar-değer çiftleriyle tutulmaktadır. Bir obje Map içerisine ekleneceği zaman bu objeyi işaret eden bir anahtar kullanılmaktadır. Obje ile ilgili işlemler yapılırken yine bu anahtar değeri kullanılır. En temel iki implementasyonu HashMap ve TreeMaptir.

HashMap, anahtarları bir hash tablosunda depolar. HaspMap, objeleri daha verimli bir şekilde almak için anahtarların hashCode() adında kullandığı bir yöntem vardır. Ana faydası, ögelerin eklenmesi ve ögenin anahtarla geri alınması hızlı bir şekilde olmaktadır, ancak dezavantajı; ögeleri eklerken sırayı kaybederiz.

TreeMap, anahtarları sıralı bir ağaç yapısında depolar. Ana yararı anahtarların her zaman sıralı bir düzende olmasıdır. Dezavantajı, ağaç büyüdükçe bir anahtarın mevcut olup olmadığının kontrolünün uzun sürmesidir.

Map Interface’inde en yaygın kullanılan metodlar aşağıdaki gibidir:

void clear() : Mapten tüm anahtar ve değerleri siler.

boolean containsKey(Object key): Anhatarın haritada olup olmadığını döndürür.

boolean containsValue(Object value): Değerin haritada olup olmadığını döndürür.

Set<Map.Entry<K,V>> entrySet(): Anahtar-değer çifti kümesini döndürür.

void forEach(BiConsumer(K key, V value)): Her anahtar/değer çiftini döngüye sokar.

	Map<Integer, Character> map = new HashMap<>();
		map.put(1, 'x');
		map.put(2, 'y');
		map.put(3, 'z');
		map.forEach((k,v)->System.out.println(v)); //x,y,z
		map.values().forEach(System.out::println); //x,y,z
		map.entrySet().forEach(e->
		 System.out.println(e.getKey()+" "+e.getValue()));//1 x,2 y,3 z

V get (Object key): Anhatara karşılık gelen değeri döndürür. Bir anahtar hiç bir değer ile eşleşmezse null döndürür.

V getOrDefault(Object key, V defaultValue): Anahtarla eşleşen değeri döndürür. Eşleşmemişse, default değeri döndürür.

Map<Character, String> map = new HashMap<>();
		map.put('x', "kalem");
		System.out.println("X bir "+map.get('x')); //X bir kalem
		System.out.println("X bir "+map.getOrDefault('x',"")); //X bir kalem
		System.out.println("Y bir "+map.get('y')); // Y bir null
		System.out.println("Y bir "+map.getOrDefault('y', "")); //Y bir
		

boolean isEmpty(): Mapin boş olup olmadığını döndürür.

V merge(K key, V value, Function(<V,V,V> func)): Belirtilen anahtar bir değerle ilişkilendirilmemişse veya değer boşsa, anahtarı belirtilen yeni değer ile ilişkilendirir. Aksi takdirde, değeri verilen fonksiyonun sonuçlarıyla değiştirir. Fonksiyonun sonucu boşsa, sonucu kaldırır.

BiFunction<String, String, String> mapper = (v1, v2) -> v1.length() > v2.length() ? v1 : v2;
		Map<String, String> favori = new HashMap<>();
		favori.put("A", "Kalem Türleri");
		favori.put("B", "Silgi");
		favori.put("C", null);

		String a = favori.merge("A", "KalemTraş", mapper);
		String b = favori.merge("B", "KalemTraş", mapper);
		String c = favori.merge("C", "KalemTraş", mapper);
		String d = favori.merge("D", "KalemTraş", mapper);

		System.out.println(favori); // {A=Kalem Türleri, B=KalemTraş, C=KalemTraş}
		System.out.println(a);// Kalem Türleri
		System.out.println(b);// KalemTraş
		System.out.println(c);// KalemTraş // Mevcut değer null. Merge fonksiyonu ile yeni değer atandı.
		System.out.println(d);// KalemTraş // Anahtar değeri başlangıçta yoktu, merge ile yeni anahtar ve değer atandı.

Set<K> keySet(): Tüm anahtarlar kümesini döndürür.

V put(K key, V value): Anahtar/değer çifti ekler veya değiştirir. Önceki değeri ve ya null döndürür. Aşağıda HashMap ve TreeMap örneği gösterilmiştir.

Map<String,String> map = new HashMap<>();
		map.put("kedi", "ot"); 
		map.put("kopek", "su");
		map.put("aslan", "et");
		System.out.println(map.get("kedi")); //ot
		for(String key: map.keySet())
				System.out.println(key);  //kopek,aslan,kedi 

V putIfAbsent(K key, V value): Anahtar yoksa değer ekler; anahtar var ve değer null ise eklenecek değeri ekler.. Aksi takdirde, mevcut değeri döndürür.

Map<String, String> map = new HashMap<>();
		map.put("x","k");
		map.put("y", null);
		map.putIfAbsent("x", "selam");
		map.putIfAbsent("z", "selam");
		map.putIfAbsent("y", "selam");
		System.out.println(map); //{x=k, y=selam, z=selam}

V remove( Object key): Anahtarla eşleşen değeri kaldırır ve döndürür. Yok ise null döndürür.

V replace(K key, V value): Belirli bir anahtar varsa değerini değiştirir.

void replaceAll(BiFunction<K,V,V> func): Fonksiyon sonucu her değerleri değiştirir.

Map<Integer, Integer> map = new HashMap<>();
		map.put(5, 10);
		map.put(15, 20);
		Integer gercek = map.replace(15, 30);
		System.out.println(map); //{5=10, 15=30}
		map.replaceAll((k,v)->k+v);
		System.out.println(map); // {5=15, 15=45}

int size() : Mapteki anahtar/değer çiftlerinin sayısını döndürür.

Collection<V> values(): Tüm değerlerin koleksiyonunu döndürür.

Map<String,String> map = new TreeMap<>();
		map.put("kedi", "ot");
		map.put("kopek", "su");
		map.put("aslan", "et");
		System.out.println(map.get("kedi")); //ot
		for(String key: map.keySet()) 
				System.out.println(key); //aslan,kedi,köpek
	    System.out.println(map.containsKey("aslan"));   //true
	    System.out.println(map.containsValue("aslan"));  //false
	    System.out.println(map.size());  //3
	    map.clear(); 
	    System.out.println(map.size()); //0
	    System.out.println(map.isEmpty());  //true