Uzun zaman önce her veri tipi üzerinde çalışacak (generic) ve bir listedeki elemanların permütasyon, kombinasyon ve k’lı permütasyonunu bulacak bir Java koduna ihtiyaç duydum. Konu genel olduğundan Java’da aradığım gibi bir kodu hemen bulurum diye düşünmüştüm. Ancak gariptir ki bulduğum kodlar yalnızca tamsayı ya da string’ler üzerinde çalşıyor ve kolay bir kullanım sunmuyorlardı. Sonuç olarak tamsayılar üzerinde çalışan ancak belirli bir algoritmaya dayanan ve yinelemeli olmayan (non-recursive) bir kod üzerinde gerekli eklemeleri yaparak ihtiyacım olan sıfıları yazmıştım. Kodların bulunduğu sayfada kullanılan algoritmaya referans da verilmişti. Özet olarak etkili ve güvenilir bir çözüm idi.

Lafı neden bu kadar uzattım? Çünkü bu sayfalara olan linkler ölmüş. Ve ben kaynak göstermek adına bu sayfaları hiç bir yerde bulamıyorum. Yine o zamanlar yazdığım kodları stackoverflow’da paylaşmıştım. Uzun bir aradan sonra burada aynı paylaşımı Türkçe olarak yapmaya karar verdim. Konuya geçelim:

Permutations, Combinations ve KPermutations isminde 3 generic (Türkçe karşılık önerisi olan?) sınıf kodladım. Sınıfların kullanımı aşağıdaki gibi. Kodların tamamı ise makalenin sonundaki bağlantıda mevcuttur.

Örneğin 3 elemanlı bir listemiz {A, B, C} olsun:

 List objects = new ArrayList();
        objects.add("A");
        objects.add("B");
        objects.add("C");

Permütasyon: Bu 3 eleman kaç farklı şekilde dizilebilir?

Permutations permutations = new Permutations(objects);
        for (List permutation : permutations) {
            System.out.println(permutation);
        }

Kodun çıktısına dikkat ederseniz burada sıranın önemli olduğunu mesela [A, B, C ] ile [C, B, A] dizilimlerinin aynı şey olmadığını görürsünüz:

[A, B, C]
[A, C, B]
[B, A, C]
[B, C, A]
[C, A, B]
[C, B, A]

Kombinasyon: 3 elemandan 2’si kaç farklı şekilde seçilebilir?

 Combinations combinations = new Combinations(objects, 2);
        for (List combination : combinations) {
            System.out.println(combination);
        }

Çıktıya dikkat ederseniz burada yukarıdakinin aksine sıranın önemli olmadığını görürsünüz. Yani [A, B] ile [B, A] aynı şey. Bu yüzden yalnız biri gösteriliyor.

[A, B]
[A, C]
[B, C]

K Permutasyon: 3 nesneden 2 nesne seçilerek kaç farklı şekilde dizilebilir?

KPermutations kPermutations = new KPermutations(objects, 2);
        for (List kPermutation : kPermutations) {
            System.out.println(kPermutation);
        }

Burada yine elemanların sırası önemlidir. Yani [A, B] ile [B, A] aynı şey değildir.

[A, B]
[B, A]
[A, C]
[C, A]
[B, C]
[C, B]

Özetle yapmanız gereken tek şey kullanıdığınız veri tipinden bir liste oluşturmak ve bu listeyi ilgili sınıfın (Permutations, Combinations veya KPermutations) yapıcı (constructor) metoduna parametre olarak aktarmak. Kodların tamamını Netbeans projesi olarak buradan indirebilirsiniz..

Umarım faydalı olmuştur. Herkese kolay gelsin

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPrint this pageEmail this to someone