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.
listboxdaki kelimeleri en kısadan en uzununa nasıl sıralarım
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
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.
- 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.
Kolay bir yolu var mı bilemiyorum fakat şöyle bir kod ile yapabilirsin; 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
Not2: Pardus ile gelen FireFox'un yazım denetimi çok hoş, tavsiye ederim
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;
Not: Ön izlemede her ne kadar Muharrem hocamın cevabını görsem de yazmaya başladığımdan yarım kalmasın istedim

Not2: Pardus ile gelen FireFox'un yazım denetimi çok hoş, tavsiye ederim

Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Yazdığımı yanlışlıkla sildim.



- 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.@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;

Re: listboxdaki kelimeleri en kısadan en uzununa nasıl sıral
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
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.
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ç
function StrLenCompare(List: TStringList; i, j: Integer): Integer;
begin
Result := Length(List[i]) - Length(List[j]);
end;
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;