Java Collections Framework'ün dört temel yapısını — List, Set, Map, TreeSet — tek bir domain'de bir arada kullanacaksın. Öğrencileri tekil tutmak (Set), derslere göre gruplamak (Map), başarıya göre sıralamak (TreeSet) ve ekleme sırasını korumak (List) bir arada. Süre: ~4-6 saat.
List<Student>(ArrayList) ile sıralı koleksiyonSet<String>(HashSet) ile tekillik (aynı öğrenci numarası iki kez eklenemez)Map<String, List<Student>>(HashMap) ile gruplama indeksiTreeSet<Student>+Comparableile otomatik sıralı koleksiyonComparable.compareTo()çok kriterli sıralama (GPA azalan, eşitse id artan)equals/hashCodebusiness key (id) üzerinden — Set/Map doğru çalışsınenum(Course) tip güvenliği- Kapsülleme: koleksiyonların KOPYASINI döndürmek
List<Student> students → tüm öğrenciler, ekleme sırasıyla
Set<String> uniqueIds → tekil öğrenci numaraları
Map<String, List<Student>> → ders kodu → o derse kayıtlı öğrenciler
TreeSet<Student> byGpa → GPA-sıralı (topN için)
- Java 17+ kurulu (
java -version). - IDE: IntelliJ IDEA Community veya VS Code + Java Extension Pack.
Course.javahazır verildi — dokunma.Student.javaveStudentRegistry.java'daki// TODO N:yorumlarını çöz.Main.javademo amaçlı hazır.
- Student.java (TODO 1-5):
compareTo(GPA azalan, eşitse id artan),equals/hashCode(id üzerinden),toString. - StudentRegistry.java (TODO 6-16):
enroll(TODO 6-9): yeni öğrenciyi List+TreeSet+Set'e ekle, dersibyCourseMap'ine yaz, çift kaydı engelle.dropCourse(TODO 10-12): dersten çıkar, boşalan ders kaydını temizle.topNStudents(TODO 13-14): TreeSet'ten ilk n.coursesOf(TODO 15): öğrencinin derslerinin kopyası.studentsInCourse(TODO 16): derse kayıtlı öğrencilerin kopyası.allStudents/allIds/countzaten hazır.
- Program to interface:
List<Student> x = new ArrayList<>()— değişkeni interface tipiyle tanımla. - Generics her zaman:
Map<String, List<Student>>, raw type (Map) kullanma. equalsoverride edincehashCode'u da et — yoksaHashSet/HashMapbozulur.TreeSet'tecompareTo0 dönen iki eleman "eşit" sayılır ve biri ATILIR — bu yüzden GPA eşitliğinde id ile ikincil sıralama şart.- Koleksiyon döndüren metodlarda iç koleksiyonu DOĞRUDAN verme — kopya döndür (kapsülleme).
- Map'e gruplarken:
getile listeyi al,nullise yeniArrayListoluştur veputet, sonra ekle.
- Aynı id'li öğrenciyi iki kez
enrollet →count()1 kalmalı. - Bir öğrenciyi aynı derse iki kez kaydet → ikincisi
falsedönmeli. - 4 farklı GPA'lı öğrenci ekle,
topNStudents(2)→ en yüksek 2 GPA sıralı gelmeli. - Bir dersi bırak →
coursesOfo dersi içermemeli. coursesOf(...)sonucunuclear()et → registry bozulmamalı (kopya döndürüyorsun).
Projede 19 JUnit testi var (tests/StudentRegistryTest.java). Testleri çalıştırınca skorun otomatik Kaizu paneline işlenir.
1. Öğrenci numaranı gir. student_id.txt dosyasına Kaizu öğrenci numaranı yaz. (Bir kez.)
2. Testleri çalıştır.
- macOS / Linux:
./run-tests.sh• Windows:.\run-tests.ps1
İlk çalıştırmada JUnit kütüphanesi (~6 MB) lib/'e iner. Başlangıçta testler kırmızı; TODO'ları çözdükçe yeşile döner.
3. Skor otomatik gider. Tüm testler geçince (19/19) panelde yeşil tik gelir.
averageGpaOf(Course course)— bir dersin ortalama GPA'sını döngüyle hesapla.mostPopularCourse()— en çok öğrencisi olan ders.studentCount(Course course)— bir derse kayıtlı öğrenci sayısı.
Takılırsan proje sayfasındaki "Çözümü Göster" butonunu kullan (proje verildikten 3 gün sonra açılır). Önce en az 1 saat kendin uğraş.