listboxdaki kelimeleri en kısadan en uzununa nasıl sıralarım

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kültigin
Üye
Mesajlar: 4
Kayıt: 29 Ara 2006 08:04
Konum: Konya

listboxdaki kelimeleri en kısadan en uzununa nasıl sıralarım

Mesaj gönderen kültigin »

Arkadaşlar geçmiş kurban bayramınız mübarek olsun
Arkadaşlar ben listboxdaki ögeleri en kısa olanından en uzun olanına sıralamak istiyorum fakta birtürlü yapamdım henüz delphiye yeni başladım bana bu konuda yardımcı olursanız çok sevinirim forumdaki bu benim ilk mesajım eğer yanlış yere yazdıysam kusura bakmayın hepinize iyi çalışmalar dilerim.yardımcı olusanız çok sevinirim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba, foruma hoşgeldin.

- Kavramsal olarak duruma bakacak olursak, kelimedeki harf sayılarını içeren bir dizide sıralama yapmak ile aynı şey olacak. Bu senin için bir anahtar bilgi.

- LENGTH( 'Kelime' ) fonksiyonu bir kelimedeki harf sayısını verir. Bu da senin anahtarlarından bir diğeri

- Bir listen olsun ve içinde 1,5,6,3,2,9 rakamları olsun. Bunları nasıl sıralarsın..

- En basit mantıkla ilk rakamı en büyük kabul edersin ve sıradaki ile karşılaştırırsın. Sıradaki daha küçükse SWAP işlemi denen yerdeğiştirme yaparsın. Sonra değişiklik yaptığın daha büyük olduğuna göre en büyük odur ve takip eden sonraki ile karşılaştırırsın. Liste sonuna vardığında en az bir değişiklik yaptığından baştan aynı işlemi tekrarlarsın, taa ki herhangi bir değişiklik yapma gereği kalmayana kadar. Bu taktirde sıralama doğru demektir.

viewtopic.php?t=17499#100417 linkinde sıralama aloritmaları hakkında bir cevap yazmıştık. Orayı incele...

- Kod aşamasına geldiğinde de yardımcı oluruz.
Resim
Resim ....Resim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Kolay bir yolu var mı bilemiyorum fakat şöyle bir kod ile yapabilirsin;

Kod: Tümünü seç

var 
  st: string;
  i, j: integer;
begin
  for i := 0 to ListBox.Items.Count -2 do
      for j := i to ListBox.Items.Count -1do
         if  length(ListBox.Items[j]) <  length(ListBox.Items[i]) then
         begin
            st := ListBox.Items[j];
            ListBox.Items[j] := ListBox.Items[i];
            ListBox.Items[i] := st;
         end;
end;
kodlamada hata olabilir. Ezbere yazdım buna benzer bir şey olacak. if teki < (küçüktür) işareti > (büyüktür) işareti ile değiştirilirse sıralama ters çevrilir.

Not: Ön izlemede her ne kadar Muharrem hocamın cevabını görsem de yazmaya başladığımdan yarım kalmasın istedim :wink:

Not2: Pardus ile gelen FireFox'un yazım denetimi çok hoş, tavsiye ederim :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Hocam ben yazdığım biraz daha klasik sendeki daha modern olsa da sen yazdığındaki döngü sayısı daha fazla, gel şunu sadeleştirelim :wink: :lol: :lol:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Yazdığımı yanlışlıkla sildim. :oops: :oops:
@mrmarman yanlışlıkla sildiği başlıkta yazdı:Hocam kod doğru.

- Madem kod yazıldı ben de bahsetiğim metodla nasıl yapılırı yazayım...

- Başlangıçta BirTurDaha boolean değişkene TRUE değeri veriyoruz ki WHILE döngüsüne girebilsin. Ondan sonra hemen FALSE ediyoruz. Herhangi bir değişiklik olursa bayrak TRUE oluyor ve döngü baştan yineleniyor. Herhangi bir değişiklik yoksa yani sıralama düzgünse bayrak FALSE kalacağından döngü sona eriyor.

- Her iki kod'da da sayacın 0'dan başladığını ve toplam sayıdan 2 eksik verildiğine dikkatini çekmekte fayda görüyorum. ListBox, Memo vb. tüm liste bileşenlerinde elemanların index'i 0'dan başlar. Bu nedenle Count-1'de biter.

Kod: Tümünü seç

var
  st : string;
  i  : integer;
  BirTurDaha : Boolean;
begin
  BirTurDaha := True;
  With ListBox1 do
    While BirTurDaha do begin
      BirTurDaha := False;
      For i := 0 to items.Count-2 do begin
        If Length(items[i]) > Length(items[i+1]) then begin
          st := Items[i];
          Items[i]   := Items[i+1];
          Items[i+1] := st;
          BirTurDaha := True;
        end; // if
      end; // For
    end; // While
end;
- Tarif ettiğim kodu yazayım dedim. En hızlısı olmasa da tarifi en kolay method olduğundandır. Hemen de kod yazmak istememiştim. Balık avlama olayından dolayı... Sonunda ise madem hocam yazmış dedim kendi kendime, kendi yazdığım açıklama ile örtüşen kod budur demek için ekledim. Yoksa senin kodun üzerine benimki gibi bir yaklaşım aldıysan üzgünüm. Öyle değil. :oops:
Resim
Resim ....Resim
kültigin
Üye
Mesajlar: 4
Kayıt: 29 Ara 2006 08:04
Konum: Konya

Re: listboxdaki kelimeleri en kısadan en uzununa nasıl sıral

Mesaj gönderen kültigin »

Yardımcı olduğunuz için hepinize teşekkürler Allah razı olsun iyi çalışmalar dilerim sanırım adminimizin yazdığı kod diğerine göre daha hızlı çalışıyor kendisine ayrıca teşekkür ederim ayrıca bu forumu hazırlayan yöneticilere ve emeği geçen herkese teşekkürler iyi çalışmalar üstatlarım
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Aslında TStringList sınıfında CustomSort diye bir metod var. Bu metoda sadece kıyaslamayı yapacak bir fonksiyon geçerek istediğiniz gibi QuickSort algoritmasına göre listeyi sıralatabilirsiniz.

Kod: Tümünü seç

function StrLenCompare(List: TStringList; i, j: Integer): Integer;
begin
  Result := Length(List[i]) - Length(List[j]);
end;
Fakat gariptir ki; TListBox sınıfının Items özelliği için TListBoxStrings diye bir sınıf kullanılmış ve CustomSort Metodu implemente edilmemiş.

Bu yüzden sağ kulağımızı sol elimizle göstermemiz gerekiyor

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
 Strs : TStringList;
begin
  Strs := TStringList.Create;
  try
    strs.Assign(listbox1.Items);
    strs.CustomSort(StrLenCompare);
    ListBox1.Items.Assign(strs);
  finally
    Strs.Free;
  end;
end;
Cevapla