karisik string

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

karisik string

Mesaj gönderen sr1111 »

biraz karişik bir sorunum var içinden çikamadim. yardimci olursaniz çok makbule geçeçek.
memo1 de portakallaşmak diye bir satirim var
yapmak istedigğim memo1 deki portakallaşmak kelimesini memo2 de kendisi varsa kendisini, yoksa kendinden kucuk fakat diğerlerinden en uzun olanini bulsun. memo2 asagidaki gibi sonuç: portakallaş/ olmali.

memo2 de
port/
farkliyazi/
portakallaş/
portakal/
porta/
portakallaşmamak/
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: karisik string

Mesaj gönderen SimaWB »

Kod: Tümünü seç

function KelimeAra(const Kelime: string): string;
var
  tmp: string;
  I: Integer;
begin
  Result := '';
  if Form2.Memo2.Lines.IndexOf(Kelime + '/') > -1 then
    Result := Kelime
  else begin
    tmp := Kelime;
    while (Result = '') and (Length(tmp)<>0) do
    begin
      tmp := Copy(tmp, 1, Length(tmp)-1);
      if Form2.Memo2.Lines.IndexOf(tmp + '/') >- 1 then
        Result := tmp + '/';
    end;
  end;
end;
There's no place like 127.0.0.1
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: karisik string

Mesaj gönderen sr1111 »

tesekkur ederim 2,3 tane sorun var bu functionda

1-memo1 de 5-10 veya daha cok kelimem oldugunda calismadi bu sekilde. memo1 de 1'er satir atlayarak işlem yapiyor kelimeyi


2- stringliste cevirdim hizli olsun diye calismiyor.
var
tmp: string;
memo2:Tmemo;
I: Integer;
sk:Tstringlist;
begin
sk:=Tstringlist.Create;
sk.add(memo2.LineS.text);
Result := '';
if sk.IndexOf(Kelime + '/') > -1 then
Result := Kelime
else begin
tmp := Kelime;
while (Result = '') and (Length(tmp)<>0) do
begin
tmp := Copy(tmp, 1, Length(tmp)-1);
if sk.IndexOf(tmp + '/') >- 1 then
Result := tmp + '/';
end;
end;
En son sr1111 tarafından 12 Ağu 2012 07:37 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: karisik string

Mesaj gönderen SimaWB »

1 - Ben Memo1 ile alakalı birşey yazmadım. Memo1'deki kelimeleri atlayarak yazıyorsa sizin başka biryerde hatanız var demektir.
2 - Memo2'deki kelimeleri StringList'e atmanız hız artışı sağlamaz. Aksine gereksiz birşey yapmış olursunuz. (Memo2.Lines zaten TStrings sınıfından türetilmiştir.)
There's no place like 127.0.0.1
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: karisik string

Mesaj gönderen sr1111 »

1- İfademi duzelteyim tam anlatamadim, şöyle diyeyim.
memo1 e bir kac kelime aldim icinde gecen (aşağıdaki gibi) o zaman doğru calismiyor. ancak memo1 1 atlayarak enterlayarak kelimeleri yazarsam doğru işlem yapiyor. veya memo1 de kendinden kucuk, buyuk benzer kelimelerin olmamasi gerekiyor.
bir test etmenizi istiyorum.

bu sekilde kullandim kelimeara yi.
for i :=0 to Memo1.Lines.Count -1 do
memo3.lines.add(kelimeara(memo1.lines));


test memo2 için
port/
farkliyazi/
portakallaş/
portakal/
porta/
portakallaşmamak/
elmaların/

memo1 için
farkliyazisa
portakallaşsa
portakalimı
portak
portakallaşmamakmi
elmalarına
portal


2-memo2 yi stringlist yapmak onemli,
memo2 de 15 mb lik bir dosya aciyorum. bunu srtringliste yuklemek daha hizli ve kolay.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: karisik string

Mesaj gönderen SimaWB »

Verdiğiniz örnekleri Memo1 ve Memo2'ye girip sonuçları Memo3'e attığımda aşağıdakileri veriyor:
farkliyazi/
portakallaş/
portakal/
porta/
portakallaşmamak/
elmaların/
porta/

Bunlar da beklenen değerler olmalı. Satır atlama gibi bir sorun varsa Memo1'e attığınız kelimeler yada Memo1'den okuma yapmaya çalıştığınız kodda bir hata vardır.
15 mb'lık bir dosyadaki kelimeleri ekranda göstermeniz gerekmiyorsa Memo1'i hiç kullanmayın. Dosyayı TFileStream yada TMemoStrem ile açın. Dosyadaki kelimeleri göstermeniz gerekiyorsa, o zaman Lines.BeginUpdate ve EndUpdate'i araştırın.
Gönderiğim kod size yol göstermek amaçlıydı. Bundan sonrası biraz araştırma......
There's no place like 127.0.0.1
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: karisik string

Mesaj gönderen sr1111 »

haklisiniz, tekrar test ettim bendeki sorun / ayraclardan kaynalaniyormus
sonu ayracli ve ayractan sonrasi diye aşağıdaki gibi test etmistim.
memo2 de Ayractan sonrasini gormuyor karistirmisim.
port/dfgdfg
farkliyazi/sdg
portakallaş/dsfdsg
portakal/
porta/sdfgsfdg
portakallaşmamak/
elmaların/sdgdgfdg

functionda sizin memo2 olarak tanimladiginiz alana 15 mb yukleme yapacagim yukaridaki gibi.
memo2 nin gozukmesi gerekmiyor. ve cok yavaş bundan dolayi stringliste veya başka bir seye cevirmeye calistim
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: karisik string

Mesaj gönderen sr1111 »

yukaridaki fonksiyonu hizlandiracak bir yol var mı. çok yavaş kalıyor 2-3 bin kelimeyi gecince.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: karisik string

Mesaj gönderen mrmarman »

Optimizasyon dediğimiz şey burada devreye giriyor.

(1) Anlamlı gruplara ayırın. Önce aynı harf ile başlayanları bir stringList'e aktarın. bu size 1000 kelimenin altında bir liste sunar.
(2) Uzunluğu daha kısa olanları bir stringlist'e aynı fonksiyonda diğerlerini diğer stringlist'e ayırın. bu da size %50-%80 kadar kazandırır.
(3) Sonra döngünüzü bu az sayıdaki listelere göre yapılandırın.

- Sürenin ışık hızında olduğunu göreceksiniz :lol:
Resim
Resim ....Resim
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: karisik string

Mesaj gönderen sr1111 »

Gruplara nasıl ayaricagim 28 harf var. bunlari döngü ile nasıl ayirip aktarabilirim. benim gibi biri için bu 3 madde de çok zor, hocam.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: karisik string

Mesaj gönderen mrmarman »

Metodoloji anlaymaya çalışıyorum. Amaç optimizasyonun tarifi.

- Sana özetle çok sayıdaki kelimeyi anlamlı gruplara ayırdığında hızlandırmanın mümkün olduğunu anlatmaya çalıştım. Projeni şu şekilde kodla şeklinde değildi ki.

- Senin projenden bi-haberim. Bunu ben bilmemem ki neler yaptın veya yapmadın. Ben olsam, "/" ayracını alır veritabanında iki farklı alana bölerdim mesela. Belki de sen bunu yaptın belki de yapmadın. Veritabanı kullanıyor musun - kullanmıyor musun onu bile bilmiyorum. Çünkü SQL ile çekerken kendiliğinden gruplandırılması söz konusu.

- Veritabanı kullamıyorsan, kelime gruplarını örnekte verdiğin gibi bulundurman da hata. Ana listende böyle bulunabilir ama sıralama algoritmanı kurduğunda sadece kelimeler olmalı. "/" sonraki içerik değil.

- Yaptığın her şey ya yük olarak sana mani olur, ya da kazanç olarak sana zamandan tasarruf. Bunu iyi değerlendirmelisin. :idea:
Resim
Resim ....Resim
Cevapla