Merhaba,
Bugün, diğer dillerde de (örneğin Python'da Demetleri) görünce artık D'de Tuple (çokuzlular) kullanma vaktidir dedim kendi kendime. Eşleme tablolarının hızı tamam da karşılığında rasgele dizilmiş veri yapısı bazen işimizi bozabilir...
Bir de Çokuzluları deneyin derim:
import std.array, std.stdio;
import std.range, std.algorithm.sorting : sort;
/* GİRİŞ NOTU:
* aşağıdaki gibi bir verimiz (aylara göre tavsiye
* edilen meyveler) ve program başlangıcımız olsun
*/
void main() {
string[int] mevsimMeyveleri = [
12:"Portakal", 1:"Nar", 2:"Ayva",
3:"Muz", 4:"Çilek", 5:"Erik",
6:"Dut", 7:"Kiraz", 8:"Kayısı",
9:"İncir", 10:"Mandalina", 11:"Greyfurt"
];
/* EŞLEME TABLOSU:
* bu veri yapısı hızlıdır fakat sıralı değildir,
* işte bu yüzden hızlıdır ama yukarıdaki gibi
* kolayca 4 mevsime bölemeyebiliriz!
*/
Not: Lütfen aşama aşama gidelim ve tüm programı derlemek için bu ara satırları silin. Zaten en sonda çıktısını verdim!
string[] meyveler; // 0'dan başlayan ay sırası
for(int ay = 1; ay < 13; ay++)
{
meyveler ~= mevsimMeyveleri[ay]; //< diziye
ay.write(": ", meyveler[$-1]); // ekrana >
if(ay == 12 )
{
writeln;
} else ", ".write;
}/* yukarısı ürkütücü değil mi?
* sıralı almak için bir metot icra etmek
* zorunda kaldım çünkü foreach() sırasız
* veriyor ama bir taşla iki kuş vurduk:
*/
meyveler.writeln("\n"); /* Sırası bozulmadan
eşleme tablosundan süzülmüş dizge dizisi */
meyveler = meyveler[$-1] ~ meyveler[0..$-1];
// artık dilimleme ile sondaki eleman başta
int[] aylar = [12]; // önce Aralık
aylar ~= iota(1, 12).staticArray!11;
Not: Lütfen aylar[]'a takılmayın dizi içeriği [ 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ] şeklinde. Kış ayları başta olsun istedim; tıpkı kod içinde yazdığım sıra gibi...
/* ÇOKUZLUYA GEÇİŞ:
* Teorik olarak sonradan oluşturulan 2 dizi,
* bunlar string[] ve int[] birbirlerine bağlı
* değil. Biz bunu zip() ile birleştiriyoruz:
*/
auto çokuzlu = zip(aylar, meyveler);
auto kışMeyveleri = çokuzlu[0..3];
foreach(meyve; kışMeyveleri)
meyve[1].write(", ");
"kış meyveleridir!".writeln;
çokuzlu.sort!((t1, t2) => t1[0] < t2[0]);
// Çokuzlu, int[] aylar'a göre sıralandı
kışMeyveleri.writeln; /* hay aksi :)
Portakal en sonda çünkü bu bir dilimdi! */
meyveler.length = 0;
meyveler.writeln;/* artık index'i 0'dan
başlayan sıradan diziye ihtiyacımız yok */
foreach(sırasızMeyveler; mevsimMeyveleri)
sırasızMeyveler.write(" ");/* artık
eşleme tablosuna da ihtiyacımız yok çünkü
sırasız! Benim PC'de Dut, Kiraz Ayva ...*/
writeln;
mevsimMeyveleri.clear;
mevsimMeyveleri.writeln;
foreach(meyve; çokuzlu) {
meyve[0].write(": ", meyve[1]);
if(meyve[0] == 12 )
{
writeln;
} else ", ".write;
}
} /* ÇIKTISI:
1: Nar, 2: Ayva, 3: Muz, 4: Çilek, 5: Erik, 6: Dut, 7: Kiraz, 8: Kayısı, 9: İncir, 10: Mandalina, 11: Greyfurt, 12: Portakal
["Nar", "Ayva", "Muz", "Çilek", "Erik", "Dut", "Kiraz", "Kayısı", "İncir", "Mandalina", "Greyfurt", "Portakal"]
Portakal, Nar, Ayva, kış meyveleridir!
[Tuple!(int, string)(1, "Nar"), Tuple!(int, string)(2, "Ayva"), Tuple!(int, string)(3, "Muz")]
[]
Dut Kiraz Ayva Greyfurt Portakal Muz Mandalina Nar Kayısı Erik Çilek İncir
[]
1: Nar, 2: Ayva, 3: Muz, 4: Çilek, 5: Erik, 6: Dut, 7: Kiraz, 8: Kayısı, 9: İncir, 10: Mandalina, 11: Greyfurt, 12: Portakal
*/
Bu son bölümde 2 şeye dikkatinizi çekmek istiyorum. Birincisi çokuzluları tıpkı bir dizi gibi dilimleyebiliyoruz. Sanırım bu eşleme tablosunda özellik gereği olmuyor. İkincisi ise çokuzluyu ay sırasına göre tekrar sıraladığımda dilim yine ilk 3 üyeyi gösteriyor ama güncel sırasına göre!
Başarılar...