# 19. Hafta — Arama, Filtreleme ve Sıralama

## Bu hafta ne yapacağız?

Okul rehberindeki kişileri ad veya dahili numarayla arayacak, bölüme göre filtreleyecek ve alfabetik sıralayacağız. Özgün uygulamada gelir-gider hareketlerini filtreleyip tutara göre sıralayacak, toplam gelir, gider ve kalan bütçeyi hesaplayacağız.

## Kazanımlar

- `where` ile birden fazla koşula göre filtreleme
- Büyük/küçük harf farkını kaldırarak metin arama
- `sort` ve `compareTo` ile sıralama
- Filtre ve sıralama işlemlerini asıl listeyi bozmadan uygulama
- `fold` ile sayısal toplam üretme
- Filtre sonucunun boş olduğu durumu kullanıcıya gösterme

## Çözümlü uygulama — Okul Rehberi

### Veri modeli

```dart
class Kisi {
  const Kisi(this.ad, this.bolum, this.dahili);
  final String ad;
  final String bolum;
  final String dahili;
}
```

### Arama ve bölüm filtresi

Arama metni küçük harfe dönüştürülür. Bir kişinin görünmesi için hem seçilen bölüme uyması hem de adı veya dahili numarası aramayla eşleşmesi gerekir.

```dart
final metin = sorgu.toLowerCase();
final liste = kisiler.where((kisi) {
  final bolumUygun = bolum == 'Tümü' || kisi.bolum == bolum;
  final aramaUygun = kisi.ad.toLowerCase().contains(metin) ||
      kisi.dahili.contains(metin);
  return bolumUygun && aramaUygun;
}).toList();
```

`where` bir `Iterable` döndürür. Listeyi sıralayabilmek için sonunda `toList()` kullanılır.

### Alfabetik sıralama

```dart
liste.sort((a, b) => azSirala
    ? a.ad.compareTo(b.ad)
    : b.ad.compareTo(a.ad));
```

Sıralama yalnız filtre sonucunun kopyasında yapılır; ana `kisiler` listesi değiştirilmez. Arama alanındaki her değişiklikte `setState` çağrıldığı için sonuçlar yazarken güncellenir.

## Gerçek Flutter ekranı

Testte arama alanına “e” yazılmış ve “Bilişim” bölümü seçilmiştir. Yalnız iki koşula da uyan üç kişi görünür.

![Kişi Arama gerçek Flutter ekranı](../../screenshots/week-19-adapted.png)

## Özgün uygulama — Öğrenci Bütçem

Pozitif tutarlar gelir, negatif tutarlar giderdir.

```dart
class Hareket {
  const Hareket(this.aciklama, this.kategori, this.tutar);
  final String aciklama;
  final String kategori;
  final double tutar;
  bool get gelir => tutar > 0;
}
```

### Gelir ve gider toplamları

```dart
final gelir = hareketler
    .where((h) => h.gelir)
    .fold<double>(0, (toplam, h) => toplam + h.tutar);

final gider = hareketler
    .where((h) => !h.gelir)
    .fold<double>(0, (toplam, h) => toplam + h.tutar.abs());

final kalan = gelir - gider;
```

### Türe göre filtre ve tutara göre sıralama

```dart
final liste = hareketler.where((h) =>
    tur == Tur.tumu ||
    (tur == Tur.gelir && h.gelir) ||
    (tur == Tur.gider && !h.gelir)).toList();

liste.sort((a, b) => b.tutar.abs().compareTo(a.tutar.abs()));
```

Mutlak değer kullanıldığı için `-180`, `-140` ve `-125.50` doğru büyüklük sırasına yerleşir.

![Bütçe Hareketleri gerçek Flutter ekranı](../../screenshots/week-19-original.png)

## Uygulama görevleri

### Kolay — Ders arama

Ders adı ve öğretmen bilgisi içeren bir listeyi iki alandan da arayın. Sonuç sayısını gösterin.

### Orta — Kantin ürün filtresi

Ürünleri kategoriye göre filtreleyin; ada ve fiyata göre artan/azalan sıralama seçenekleri ekleyin.

### İleri — Harcama raporu

Hareketlere tarih ekleyin. Ay, kategori ve gelir-gider türünü birlikte filtreleyin; filtrelenen sonuçların toplamını ve yüzdesini gösterin.

## Kontrol ve test

- Boş arama bütün uygun kayıtları göstermeli.
- Büyük ve küçük harf aynı sonucu vermeli.
- Hiç sonuç yoksa açıklayıcı boş durum görünmeli.
- Filtreyi kapatınca asıl veriler geri gelmeli.
- Artan ve azalan sıralama ters sonuç üretmeli.
- Negatif giderler toplamda pozitif gider değeri olarak kullanılmalı.

## Geri bildirim ve çözüm erişimi

Öğrenci çözümünü gönderdikten sonra **İpucunu göster** yalnız algoritmayı açıklar. **Örnek çözümü göster** gerçek `lib/main.dart` kodunu, indirme düğmesi ise eksiksiz ve çevrim dışı çalıştırılabilir Flutter projesini sunar.

## Kaynak projeler

- Konu uygulaması: `05 - Modelleme ve Listeler/Uygulamalar/Uygulama-19-Kişi Arama`
- Özgün uygulama: `05 - Modelleme ve Listeler/Uygulamalar/Ozgun-19-Bütçe Hareketleri`
