thenComparing ile Çok Anahtarlı Sıralama
Öncelik sırasına göre birden fazla alana göre sıralamak için karşılaştırıcıları thenComparing ile zincirleyin.
thenComparing ile Çok Anahtarlı Sıralama, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. 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.
Çok Anahtarlı Sıralama
thenComparing(), birden çok alana göre sıralama yapmak için Comparator'ları zincirler. Önce birincil sıralama yapılır; değerler eşitse ikincil sıralamaya, ardından sonrakilere geçilir.
Temel thenComparing
Birincil Comparator sonrasında eşitlikleri çözmek için thenComparing() kullanın.
import java.util.*;
record Student(String name, int grade, double gpa) {}
List<Student> students = List.of(
new Student("Alice", 10, 3.9),
new Student("Bob", 11, 3.7),
new Student("Charlie", 10, 3.8),
new Student("Diana", 11, 3.7)
);
Comparator<Student> sort = Comparator.comparingInt(Student::grade)
.thenComparingDouble(Student::gpa).reversed()
.thenComparing(Student::name);
students.stream().sorted(sort).forEach(System.out::println);Üç Seviyeli Sıralama
Gerektiği kadar thenComparing seviyesini zincirleyin.
record Employee(String dept, String team, String name, double salary) {}
List<Employee> employees = List.of(
new Employee("Eng", "Backend", "Alice", 95000),
new Employee("Eng", "Backend", "Bob", 92000),
new Employee("Eng", "Frontend","Charlie", 88000),
new Employee("Mkt", "Growth", "Diana", 75000)
);
Comparator<Employee> sort = Comparator
.comparing(Employee::dept)
.thenComparing(Employee::team)
.thenComparing(Comparator.comparingDouble(Employee::salary).reversed());
employees.stream().sorted(sort)
.forEach(e -> System.out.printf("%s > %s > %s: $%.0f%n",
e.dept(), e.team(), e.name(), e.salary()));Comparator ile thenComparing
İkincil anahtarlar için tersine çevrilmiş veya özel bir sıralamaya ihtiyaç duyduğunuzda Comparator kabul eden aşırı yüklenmiş yöntemi kullanın.
Comparator<Employee> sort = Comparator
.comparing(Employee::dept)
.thenComparing(Comparator.comparing(Employee::salary).reversed()); // highest paid first
// equivalent: .thenComparingDouble(Employee::salary, Comparator.reverseOrder())null Alanlarla Sıralama
İsteğe bağlı alanları sorunsuzca işlemek için thenComparing'i nullsLast/nullsFirst ile birleştirin.
record Product(String name, String category, Double rating) {}
Comparator<Product> sort = Comparator
.comparing(Product::category, Comparator.nullsLast(Comparator.naturalOrder()))
.thenComparing(Product::rating, Comparator.nullsLast(Comparator.reverseOrder()))
.thenComparing(Product::name);Dinamik Sıralama Anahtarı Seçimi
Kullanıcı tercihine göre çalışma zamanında sıralama anahtarını seçin.
static Comparator<Product> sortBy(String key) {
return switch (key) {
case "price" -> Comparator.comparingDouble(Product::price);
case "name" -> Comparator.comparing(Product::name);
case "stock" -> Comparator.comparingInt(Product::stock).reversed();
default -> Comparator.comparingDouble(Product::price);
};
}
String userChoice = "stock";
products.stream().sorted(sortBy(userChoice)).forEach(System.out::println);Çıkarıcı İşlevle thenComparing
thenComparing(Function<T,U>) aşırı yüklemesi, açık bir Comparator gerektirmeden ikincil sıralama için Comparable bir anahtar çıkarır.
record Event(String type, int year, int month, int day) {}
Comparator<Event> chronological = Comparator
.comparing(Event::type)
.thenComparingInt(Event::year)
.thenComparingInt(Event::month)
.thenComparingInt(Event::day);Kayıt Koleksiyonlarını Sıralama
Erişim yöntemlerine sahip kayıtlar, Comparator zincirlerindeki yöntem başvurularıyla sorunsuz şekilde çalışır.
record Order(String customerId, String status, double total, java.time.LocalDate date) {}
List<Order> orders = loadOrders();
Comparator<Order> byCustomerThenDate = Comparator
.comparing(Order::customerId)
.thenComparing(Order::date, Comparator.reverseOrder()); // newest first per customer
orders.stream().sorted(byCustomerThenDate)
.collect(Collectors.groupingBy(Order::customerId))
.forEach((cust, ords) -> {
System.out.println("Customer: " + cust);
ords.forEach(o -> System.out.println(" " + o.date() + " $" + o.total()));
});Kararlı Sıralama Garantisi
Java'da nesneler için kullanılan List.sort() ve Arrays.sort(), kararlı bir birleştirmeli sıralama kullanır. Karşılaştırıldığında eşit olan öğeler, özgün göreli sıralarını korur.
// Stable sort example:
// First sort by name, then by dept
// Equal dept elements preserve the name order from previous sort
List<Employee> sorted = employees.stream()
.sorted(Comparator.comparing(Employee::name)) // 1st pass
.sorted(Comparator.comparing(Employee::dept)) // 2nd pass (stable!)
.collect(Collectors.toList());
// Within each dept, employees remain alphabetically sortedAnahtar Comparator ile Comparator.comparing
İki bağımsız değişkenli Comparator.comparing(keyExtractor, keyComparator) biçimi, hem anahtarı hem de anahtarın sıralamasını belirtmenizi sağlar.
// Sort by name length, then alphabetically within same length
Comparator<String> c = Comparator
.comparing(String::length, Integer::compare)
.thenComparing(Comparator.naturalOrder());
List<String> words = new ArrayList<>(List.of("fig","apple","kiwi","banana","pea"));
words.sort(c);
System.out.println(words); // [fig, pea, kiwi, apple, banana]Gerçek Dünya: Uçuş Arama Sonuçları
Uçuş arama sonuçlarını önce fiyata, ardından süreye, sonra da kalkış saatine göre sıralama.
record Flight(String airline, double price, int durationMin, java.time.LocalTime departs) {}
Comparator<Flight> bestFlight = Comparator
.comparingDouble(Flight::price)
.thenComparingInt(Flight::durationMin)
.thenComparing(Flight::departs);Sıralanmış Sonuçları Toplama
Çok anahtarlı sıralamayı toplayıcılarla birleştirerek sıralanmış gruplar veya eşlemeler oluşturun.
Map<String, List<Employee>> byDept = employees.stream()
.sorted(Comparator.comparing(Employee::dept)
.thenComparing(Comparator.comparingDouble(Employee::salary).reversed()))
.collect(Collectors.groupingBy(Employee::dept,
LinkedHashMap::new, // preserve insertion (sorted) order
Collectors.toList()));
byDept.forEach((dept, emps) -> {
System.out.println(dept + ":");
emps.forEach(e -> System.out.println(" " + e.name() + " $" + e.salary()));
});Hızlı Kontrol
Çalışanları önce departmana alfabetik sırayla, ardından salary değerine azalan sırayla göre sıralamak istiyorsunuz. Hangi zincir doğrudur?
Özet: thenComparing ile Çok Anahtarlı Sıralama
Ana çıkarımlar:
- thenComparing() birincil anahtarlar eşit olduğunda uygulanan ikincil sıralama anahtarları ekler
- Gerektiği kadar thenComparing düzeyini zincirleyin
- İkincil anahtarın azalan sırada olması gerektiğinde reversed() ile thenComparing yöntemini kullanın
- İsteğe bağlı alanlar için nullsFirst/nullsLast ile birleştirin
- Java'nın List.sort() yöntemi kararlıdır — eşit öğeler özgün sıralarını korur
- Dinamik sıralama seçimi: çalışma zamanında doğru karşılaştırıcıyı döndürmek için switch kullanın
Sıkça Sorulan Sorular
“thenComparing ile Çok Anahtarlı Sıralama” dersi ücretsiz mi?
Evet — “thenComparing ile Çok Anahtarlı Sıralama” 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.
“thenComparing ile Çok Anahtarlı Sıralama” dersinde ne öğreneceğim?
Öncelik sırasına göre birden fazla alana göre sıralamak için karşılaştırıcıları thenComparing ile zincirleyin. 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 3. dersidir.
“thenComparing ile Çok Anahtarlı Sıralama” 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
- Comparable Arayüzü
- Comparator ve Lambda ile Sıralama
- thenComparing ile Çok Anahtarlı Sıralama
- Dizileri ve Koleksiyonları Uygulamada Sıralama