String ifadelerin kombinasyonu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kocaV
Üye
Mesajlar: 15
Kayıt: 21 Tem 2017 01:10

String ifadelerin kombinasyonu

Mesaj gönderen kocaV »

Merhaba,
string değerler içeren değişken bir dizi ile (örneğin 4 elemanlı) elamanları birbirinden farklı (örneğin 3'erli) gruplar oluşturmak istiyorum.
örnek:
elemanlar:ahmet, mehmet, ayşe, veli

gruplar
ahmet,mehmet,ayşe
ahmet,mehmet,veli
ahmet,ayşe,veli
mehmet,ayşe,veli


Araştırmalarıma göre, kombinasyonu oluşturabilmek için recursive denen bir yöntemle kendini yineleyen döngüler oluşturulmuş
fakat genelde örnekler integer değerlerle yapılmış. Maalesef bulduğum bu örnekleri kendi isteğime göre uyarlayamadım.

En yakın bulduğum kod: @t-hex 2005 yılında 49'un 6'lı kombinasyonu nasıl yapılır sorusuna cevaben yazmış...

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
const
  TOPLAMSAYI = 49;
  ELEMANSAYISI = 6;
  procedure recurse(num:byte;toplam:byte; bool : boolean;S:String);
  begin
     if bool then s := s+inttostr(num)+',';
     if toplam = ELEMANSAYISI then begin
       listbox1.items.add(s);
       exit;
     end;
     if num = TOPLAMSAYI then exit;
     recurse(num+1,toplam+1,true,s);
     recurse(num+1,toplam,false,s);
  end;
var
 s:string;
begin
 s := '';
 recurse(0,0,false,s);
end;
Yardımcı olabilir misiniz?
delphi sürümü: xe7
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: String ifadelerin kombinasyonu

Mesaj gönderen SimaWB »

Kelimelerinize integer bir değerle(index ile) ulaşmak için:

Kod: Tümünü seç

var
 SL: TStringList;
begin
 SL := TStringList.Create;
 try
   SL.Delimiter := ', ';
   SL.StrictDelimiter := True;
   SL.DelimitedText := 'ahmet, mehmet, ayşe, veli';
   // Bu aşamadan sonra kelimelerinize index ile ulaşabilirsiniz
   // SL.Strings[0]
   // SL.Strings[1]
   //...
 finally
   SL.Free;
 end;
end;
There's no place like 127.0.0.1
kocaV
Üye
Mesajlar: 15
Kayıt: 21 Tem 2017 01:10

Re: String ifadelerin kombinasyonu

Mesaj gönderen kocaV »

SimaWB yazdı: 01 Ağu 2017 09:44 Kelimelerinize integer bir değerle(index ile) ulaşmak için:

Kod: Tümünü seç

var
 SL: TStringList;
begin
 SL := TStringList.Create;
 try
   SL.Delimiter := ', ';
   SL.StrictDelimiter := True;
   SL.DelimitedText := 'ahmet, mehmet, ayşe, veli';
   // Bu aşamadan sonra kelimelerinize index ile ulaşabilirsiniz
   // SL.Strings[0]
   // SL.Strings[1]
   //...
 finally
   SL.Free;
 end;
end;
ilginiz için teşekkür ederim.
sanırım sorumu yanlış anladınız , ben kombinasyon şeklinde gruplar oluşturmak istiyorum. Veriler zaten dizi elamanı olduğundan elemanlara erişimle ilgili bir sıkıntı yok.

örnek : 5 eleman var 3 lü gruplar oluşacak : birbirinden farklı 10 grup yapıyor
örnek : 10 eleman ve 5 li gruplar oluşacak : birbirinden farklı 252 grup yapıyor...
String ifadelerden oluşan bu elemanlar ile bahsettiğim grupları nasıl oluşturabilirim?
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: String ifadelerin kombinasyonu

Mesaj gönderen ertank »

Merhaba,

Sizin istediğiniz 6 kademe iç içe girilmesi gereken bir döngü değil. Sadece iki döngü ile yapmanız mümkün. Farklı yöntemler tercih edilebilir. Aşağıda aklıma gelen ilk uygulama şeklinin örnek kodunu bulabilirsiniz.

Kod: Tümünü seç

function KombinasyonYap(const Liste: TStrings; const ListedeOlmayacakDeger: string): string;
var
  i: Integer;
begin
  Result := EmptyStr;
  if Liste.Count = 0 then Exit();

  for i := 0 to Liste.Count - 1 do
  begin
    if Liste[i] <> ListedeOlmayacakDeger then
      Result := Result + Liste[i] + ',';
  end;

  SetLength(Result, Length(Result) - 1); // en sondaki virgülü sil
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  i: Integer;
  DisListe: TStringList;
begin
  DisListe := TStringList.Create();
  try
    // Boşluk ile ayrılmış birkaç kelime olsa dahi
    // mutlaka iki virgül arasında kalan ifadeyi kullan.
    DisListe.StrictDelimiter := True;
    DisListe.Delimiter := ',';
    DisListe.DelimitedText := 'ahmet,mehmet can,ayşe,veli'; // kombinasyonunu yapmak istediğimiz değerler dizisi
    for i := 0 to DisListe.Count - 1  do
    begin
      // Liste içindeki her bir kelimeyi kullanarak,
      // Her seferinde ilgili kelime kombinasyon içinde olmayacak şekilde
      // kombinasyon yap
      Memo1.Lines.Add(KombinasyonYap(DisListe, DisListe[i])); // her bir kombinasyonu TMemo bileşeni içinde göster
    end;
  finally
    DisListe.Free(); // Hafıza kaçağı olmasın
  end;
end;
En son ertank tarafından 01 Ağu 2017 01:02 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: String ifadelerin kombinasyonu

Mesaj gönderen ertank »

kocaV yazdı: 01 Ağu 2017 12:33
SimaWB yazdı: 01 Ağu 2017 09:44 Kelimelerinize integer bir değerle(index ile) ulaşmak için:

Kod: Tümünü seç

var
 SL: TStringList;
begin
 SL := TStringList.Create;
 try
   SL.Delimiter := ', ';
   SL.StrictDelimiter := True;
   SL.DelimitedText := 'ahmet, mehmet, ayşe, veli';
   // Bu aşamadan sonra kelimelerinize index ile ulaşabilirsiniz
   // SL.Strings[0]
   // SL.Strings[1]
   //...
 finally
   SL.Free;
 end;
end;
ilginiz için teşekkür ederim.
sanırım sorumu yanlış anladınız , ben kombinasyon şeklinde gruplar oluşturmak istiyorum. Veriler zaten dizi elamanı olduğundan elemanlara erişimle ilgili bir sıkıntı yok.

örnek : 5 eleman var 3 lü gruplar oluşacak : birbirinden farklı 10 grup yapıyor
örnek : 10 eleman ve 5 li gruplar oluşacak : birbirinden farklı 252 grup yapıyor...
String ifadelerden oluşan bu elemanlar ile bahsettiğim grupları nasıl oluşturabilirim?
@SimaWB sorunuzu doğru anladı. Sadece tam cevap vermeyip size yol gösterdi.

Ancak siz orjinal sorunuzu eksik sorduğunuz için az önce verdiğim cevap ihtiyacınızı tam olarak görmeyecektir. Sorularımızı biraz daha düşünerek ve problemimizi tam yansıtacak şekilde sorabilirsek hem cevaplayacak kişilerin vaktini hemde kendi vaktimizi boşuna harcamamış oluruz.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: String ifadelerin kombinasyonu

Mesaj gönderen SimaWB »

Teşekkür ederim @ertank. Evet ben de yanlış anladığımı düşünmüyorum.

@kocaV; siz soruyu sorarken demişsiniz ki "genelde örnekler integer değerlerle yapılmış". Benim gösterdiğim yol ile kelimelere integer değerler'le ulaşabildiğinize göre sorun kalmaması lazım.

Tavsiyem; biraz daha araştırın yada soruyu değiştirin.
There's no place like 127.0.0.1
Cevapla