Alt Haritalar ve Aralık Görünümleri
Sıralı haritalarda aralığa dayalı aramalar için subMap, headMap ve tailMap görünümlerini çıkarın.
Alt Haritalar ve Aralık Görünümleri, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
TreeMap'te Aralık Görünümleri
TreeMap'in subMap, headMap ve tailMap yöntemleri desteklenen görünümler döndürür; bu görünümler temel map'teki değişiklikleri ve bunun tersini yansıtır. Görünüm üzerinden yapılan değişiklikler özgün map'e yansır.
TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 1; i <= 10; i++) map.put(i * 10, "item" + i);
var view = map.subMap(30, 70); // [30, 70)
System.out.println(view); // {30=item3, 40=item4, 50=item5, 60=item6}
map.put(45, "new"); // also visible through view!
System.out.println(view.containsKey(45)); // trueheadMap: Sınırın Altındaki Anahtarlar
headMap(toKey), anahtarları kesinlikle toKey değerinden küçük olan tüm girdileri döndürür. Sınırı da dahil etmek için kapsayıcı varyant olan headMap(toKey, true) yöntemini kullanın.
TreeMap<String, Integer> words = new TreeMap<>();
"banana cherry apple date elderberry".chars()
.mapToObj(c -> String.valueOf((char)c)).distinct()
.forEach(w -> words.put(w, w.length()));
// Actually let's use real words:
TreeMap<String, Integer> wc = new TreeMap<>();
wc.put("apple",5); wc.put("banana",6); wc.put("cherry",6); wc.put("date",4);
System.out.println(wc.headMap("cherry")); // {apple=5, banana=6}tailMap: Bir Sınırdan Başlayan Anahtarlar
tailMap(fromKey), anahtarları ≥ fromKey olan tüm girdileri döndürür.
TreeMap<Integer, String> grades = new TreeMap<>();
grades.put(50,"F"); grades.put(60,"D"); grades.put(70,"C"); grades.put(80,"B"); grades.put(90,"A");
// All passing grades (>= 60)
var passing = grades.tailMap(60);
System.out.println(passing); // {60=D, 70=C, 80=B, 90=A}Kapsayıcı Sınırlarla subMap
4 bağımsız değişkenli subMap(from, fromInclusive, to, toInclusive) yöntemi, sınırların kapsayıcı olup olmadığını tamamen denetlemenizi sağlar:
TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 10; i <= 100; i += 10) map.put(i, "v"+i);
// [30, 60] — both inclusive
System.out.println(map.subMap(30, true, 60, true));
// {30=v30, 40=v40, 50=v50, 60=v60}
// (30, 60) — both exclusive
System.out.println(map.subMap(30, false, 60, false));
// {40=v40, 50=v50}Görünüm Üzerinden Değişiklik Yapma
Bir subMap görünümündeki put/remove işlemleri özgün map'e yansır ve bunun tersi de geçerlidir. Görünümün aralığı dışında bir anahtar eklemeye çalışmak hata fırlatır.
TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 1; i <= 5; i++) map.put(i * 10, "v" + i);
var view = map.subMap(20, 40); // [20, 40)
view.remove(20); // removes from both view and original map
System.out.println(map.containsKey(20)); // false
// This would throw IllegalArgumentException:
// view.put(50, "out of range");Kullanım Alanı: Günlük Aralığı Sorgusu
Bir TreeMap aralık görünümünü kullanarak iki zaman damgası arasındaki tüm günlük girdilerini alın:
import java.time.*;
TreeMap<LocalDateTime, String> logs = new TreeMap<>();
logs.put(LocalDateTime.of(2024,1,1,8,0), "Server start");
logs.put(LocalDateTime.of(2024,1,1,10,0), "Request spike");
logs.put(LocalDateTime.of(2024,1,1,14,0), "Maintenance");
logs.put(LocalDateTime.of(2024,1,1,18,0), "Server stop");
var morning = logs.subMap(
LocalDateTime.of(2024,1,1,8,0), true,
LocalDateTime.of(2024,1,1,12,0), false
);
morning.forEach((t,m) -> System.out.println(t+" : "+m));Kullanım Alanı: Fiyat Aralığı Araması
Fiyatları TreeMap anahtarları olarak kullanarak bir fiyat aralığındaki tüm ürünleri bulun:
TreeMap<Double, String> products = new TreeMap<>();
products.put(9.99, "Pen");
products.put(24.99, "Book");
products.put(49.99, "Headphones");
products.put(299.99, "Tablet");
double min = 10.0, max = 100.0;
var affordable = products.subMap(min, true, max, true);
affordable.forEach((p,n) -> System.out.println(n+" $"+p));
// Book $24.99, Headphones $49.99Azalan subMap
Ters sırada gezinmek için bir görünüm üzerinde descendingMap() çağrısını zincirleyin:
TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 10; i <= 100; i += 10) map.put(i, "v"+i);
// Get [40, 80] in descending order
map.subMap(40, true, 80, true)
.descendingMap()
.forEach((k,v) -> System.out.println(k + "=" + v));
// 80=v80, 70=v70, 60=v60, 50=v50, 40=v40NavigableMap Arayüzü
NavigableMap, SortedMap'i genişletir ve azalan görünümlerin yanı sıra ceiling/floor/higher/lower anahtar gezinmesini ekler. TreeMap en yaygın uygulamadır; ConcurrentSkipListMap ise iş parçacığı açısından güvenli alternatiftir.
Görünümlerin Performansı
Alt map görünümündeki işlemler (get, put, containsKey), temel TreeMap'tekiyle aynı olan O(log n) karmaşıklığa sahiptir. Görünümün kendisini oluşturmak O(1) sürede gerçekleşir; kopyalama yapılmaz. Görünümdeki n anahtar üzerinde aralık taraması, N'nin tam map boyutu olduğu durumda O(log N + n) sürede gerçekleşir.
Tuzak: Güncelliğini Yitirmiş Görünümler
Görünümler özgün map tarafından desteklendiğinden, özgün map temizlenirse görünüm boşalabilir veya hata fırlatabilir. Görünümlerin canlı olduğunu her zaman belgeleyin ve bunları amaçlanan yaşam döngülerinin ötesinde saklamayın.
TreeMap<Integer, String> map = new TreeMap<>();
map.put(10, "a"); map.put(20, "b"); map.put(30, "c");
var view = map.subMap(10, 30);
map.clear(); // view becomes empty
System.out.println(view.size()); // 0 — but no exceptionHızlı Kontrol
Anahtarları {10,20,30,40,50,60,70,80} olan bir TreeMap üzerinde map.subMap(30, false, 70, true) çağrısını yapıyorsunuz. Sonuçta hangi anahtarlar bulunur?
Özet: Alt Map'ler ve Aralık Görünümleri
Temel çıkarımlar:
- subMap, headMap ve tailMap canlı, desteklenen görünümler döndürür; kopyalama yapılmaz
- Görünümdeki değişiklikler özgün map'e, özgün map'teki değişiklikler de görünüme yansır
- Sınırları tamamen denetlemek için 4 bağımsız değişkenli subMap(from, fromInclusive, to, toInclusive) kullanın
- Görünüm üzerinden aralık dışındaki put işlemleri IllegalArgumentException fırlatır
- Aralık taramasının karmaşıklığı: O(log N + n)
Sıkça Sorulan Sorular
“Alt Haritalar ve Aralık Görünümleri” dersi ücretsiz mi?
Evet — “Alt Haritalar ve Aralık Görünümleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Alt Haritalar ve Aralık Görünümleri” dersinde ne öğreneceğim?
Sıralı haritalarda aralığa dayalı aramalar için subMap, headMap ve tailMap görünümlerini çıkarın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Alt Haritalar ve Aralık Görünümleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- TreeMap: Sıralı Anahtar-Değer Çiftleri
- Alt Haritalar ve Aralık Görünümleri
- TreeSet ve NavigableSet
- Ağaç Koleksiyonlarında Özel Sıralama