ARRAY GRUPLANDIRMA VE FİLTRELEME

Merhaba, bu yazımda bir modeli olan arrayin içindeki değişkenlere bakarak gruplandırarak ve filtreleyerek istediğimiz bilgileri elde edeceğiz.

Bu yazıda;

  • valueForKeyPath:@”@distinctUnionOfObjects.##” ile arraydeki objelerin gruplandırılmasını sağlayacağız.

  • NSPredicate kullanarak bazı paremetrelerle filtreleme yapacağız.

  • sortedArrayUsingSelector:@selector(compare:) kullanarak Ascending olarak bir arrayi sort edeceğiz.

 

İlk olarak Array için bir model oluşturalım. Model isimli bir NSObjects’den türeyen bir class yaratıyoruz.

Model.h :

Birde Model.m dosyasını oluşturalım :

Yukarda bir instancetype dönerek farklı bir çeşit init oluşturduk. Pratik bir şekilde objeleri oluşturmamızı sağlayacak olan bu yapıyla tip, yıl, gün ve saat bilgilerinin oluşturulması sağlanacak.

Bilgilerimizi oluşturduktan sonra ViewController’umuza dönelim. ViewController.m ‘de “modelOlustur” isimli yeni bir method oluşturacağız. Bu method ile modelimizi oluşturacağız;

Şimdi bu bilgileri pratik bir şekilde ViewControllerda tutabilmek için interfacede property oluşturalım. Ve daha yazmadığımız ama ihtiyaç duyacağımız “tipleriYazdir” ve “saatleriYazdirWithTip” isimli methodları çağıran kodları şimdiden yazalım.

Şimdi modelde olan tipleri gruplandırarak output yazdırabilmek için tipleriYazdir isimli methodumuzu yazalım;

Yukarda distinctUnionOfObjects.Tip yazarak Array modeli içersindeki Tip isimli değişkendeki bilgilerin gruplandırılmasını sağlamış oluyoruz. Örneğimizde 1 ve 2 olmak üzere 2 adet tip bulunduğu için 2 adet nesnesi olan array oluşturuluyor. Burada önemli olan husus valueForKeyPath ile gruplandırarak çektiğiniz bilgiler null da olabilir veya stringte gelebilir. O yüzden burada NSNumber veya NSString tipinde arrayleri kullanmanız gerekmektedir.

Son olarak saatleriYazdirWithTip isimli methodumuzu oluşturuyoruz;

Yukardaki kodda ilk olarak predicateWithFormat ile bir filtreleme yapılıyor . Tipi 2 olan ve Yılı 2016 olan bilgileri filteredArrayUsingPredicate ile filtreliModeller isimli arayimize setliyoruz.

Setlenen bilgiler şunlar olacaktır;

Dikkat ederseniz günlerle ilgili bir filtre bilgisi girilmedi dolayısıyla 1 ve 2 numaralı günlerin bilgileri de geldi. Ancak burda dikkat edilmesi gereken 1. günde saat 9 var iken 2. günde saat 9 yok ancak saat 12 var iken 1. günde yok ve diğer saatler her ikisinde de mevcut. 10 ve 11. saatler her iki günde olduğundan tekrar etmektedir.

Bizim amacımız Tipi 2 olan Yılı 2016 olan saat bilgilerini çekmekti dolayısıyla burada da saate göre filtreleme yapmamız gerekmektedir. Bunu gene önceki örnekteki gibi distinctUnionOfObjects.Saat ile yapıyoruz. Bunu yapmamızla beraber bizim istediğimiz gibi tekrar etmeyen gruplanmış saat bilgileri elde edildi.

Lakin saat bilgilerinin sıralı gelmediğini fark ettiğimizden bu yazının bonus bilgisi olarak sortedArrayUsingSelector:@selector(compare:) kullanarak arrayi Ascending olarak sort ediyoruz ve bilgileri output olarak veriyoruz.

 

Tüm projeyi derlediğimizde şu outputu elde etmiş olacağız;

 

281 total views, 1 views today

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir