Merhaba,
Geçenlerde şurada (http://ddili.org/forum/post/10690) değindiğimiz konuda, çağrışımsal dizi (Associative Array) kullanarak bir arama/bulma işlemi örneği nakletmiştim. Gerçi aşağıda paylaşacağım örnek, sayısal veriler üzerine yaptığımız bu denemelerden biraz farklı. Belki hız testi öncekinden (1.'si AA idi) farklı da olabilir, bilemiyorum bence hashTable oluşturulurken geçen zaman da hesaplanmalı!
Bu örnekte, kanımca şunlar önemli:
- Sadece basit bir yapı (struct IrregularVerbs, kısaca IV) türü kullandım
- Ve bunun içerisine ek bir yöntem (method) tanımlamadım (sadece string dizisi de gönderebilirdim!)
- Bu yapı üzerinde bir dizi veriyi ADizi'ye gönderip dizinledim (indexing)
- Ayrıca ADizi içerisinde bir nevi IV'nin toString'ni tanımladım
- Belki de bu sayede veri dizisi (IV veri[]) bellekte daha az yer kapladı
import std.stdio;
struct IrregularVerbs {
string Infinitive;
string SimplePast;
string Participle;
} alias IrregularVerbs IV;
struct ADizi {
size_t[string] arananSözcük;
IrregularVerbs[] kaynakVeri;
this(IrregularVerbs[] veri) {
kaynakVeri = veri;
foreach(size_t sıra, sözcük; veri) {
arananSözcük[sözcük.Infinitive] = sıra;
}
}
size_t get(string sözcük) {
return arananSözcük.get(sözcük, -1);
}
string opIndex(size_t sıra) {
char verticalTab = 11; // \n...\t
auto result = "Bulunan sonuç: " ~ verticalTab;
result ~= kaynakVeri[sıra].Infinitive ~ "\t";
result ~= kaynakVeri[sıra].SimplePast ~ "\t";
result ~= kaynakVeri[sıra].Participle ~ "\n";
return result;
}
}
void main(string[] argv){
IV veri[];
veri ~= IV("bear", "bore", "borne");
veri ~= IV("begin", "began", "begun");
veri ~= IV("bid", "bade", "bidden");
veri ~= IV("bite", "bit", "bitten");
veri ~= IV("blow", "blew", "blown");
veri ~= IV("break", "broke", "broken");
veri ~= IV("choose", "chose", "chosen");
veri ~= IV("come", "came", "come");
veri ~= IV("do", "did", "done");
veri ~= IV("draw", "drew", "drawn");
veri ~= IV("drink", "drank", "drunk");
veri ~= IV("drive", "drove", "driven");
veri ~= IV("eat", "ate", "eaten");
veri ~= IV("fall", "fell", "fallen");
veri ~= IV("fly", "flew", "flown");
auto test = ADizi(veri);
auto sözcük = "do";
auto bulduğuDizin = test.get(sözcük);
if(bulduğuDizin != -1) {
test[bulduğuDizin].writeln();
} else {
sözcük.writeln(" bulunamadı!");
}
} /* Çıktısı:
Bulunan sonuç:
do did done
*/
Sevgiler, saygılar...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]