2016-04-11 39 views
0

Bir veri kümesinin tüm kombinasyonlarını döndürmek için tökezlediğim yineleme algoritmasının değiştirilmiş bir sürümünü kullanıyorum. Örneğin: eğer veri seti ["ABCD", "ACDEF", "ABDFG", "BDEF", "CGEGD"] olursa, aşağıdakileri listede görmek isterim; Belirtilen uzunluk için başka bir benzersiz öğe.Java, yinelemeli void işlevinin sonucunu kullanır, her birini listeye ekler ve başka bir işleve geri döner

ABC, ABD, ABE, ABF, ABG, ACE, ACF, ACG, ADE, ADF, AAG, AEG, AFG, BCD, BCC, BCG, BCG, BDE, BDF, BEF, BEF,

import java.util.ArrayList; 
import java.util.LinkedHashSet; 
import java.util.List; 
import java.util.Set; 

class Comboo { 

    public static void combinationAssShit(String arr[], String data[], int start, int end, int index, int r){ 

    if (index == r) 
    { 
     for (int j=0; j<r; j++) 
      System.out.print(data[j]+" "); 

     System.out.println(""); 
     return; 
    } 

    for (int i=start; i<=end && end-i >= r-index; i++) 
    { 
     data[index] = arr[i]; 
     combinationAssShit(arr, data, i+1, end, index+1, r); 
    } 
} 

    public static void printCombination(String arr[], int n, int r) 
    { 
     String data[]=new String[r]; 
     combinationAssShit(arr, data, 0, n, 0, r); 
    } 

    public static String[] singleElem(String[] data) { 
     List<String> single = new ArrayList<String>(); 

     for (String element: data) { 
      for (int x = 0; x < element.length(); x++) { 
       single.add(Character.toString(element.charAt(x))); 
      } 
     } 

     Set<String> singleS = new LinkedHashSet<String>(single); 

     List<String> singleL = new ArrayList<String>(); 

     singleL.addAll(singleS); 

     String[] john = singleL.toArray(new String[singleL.size()]); 
     return john; 
    } 

    public static void main (String[] args) { 
     String arr[] = {"ABCD", "ACDEF", "ABDFG", "BDEF", "CGEGD"}; 
     int r = 3; 

     String[] t = singleElem(arr); 
     int n = t.length; 
     printCombination(t, n, r); 
    } 
} 

unutmayın: BEG, BFG, CDE, CDF, CDG, CEF, CEG, CFG, DEF DEG, DFG, EFG

İşte şimdiye kadar benim sınıftır. Yapılması gereken çok fazla düzeltmenin olduğunu biliyorum. Ben de Java için yeni bir markayım. C++ ve Python için kullanıyorum, ki bu problemin çözümünde, birleşik kombinasyonun sonucunu vererek bir listedeki kombinasyonları toplamak çok daha kolay.

+0

Hiçbir geçersiz işlevin sonucu yoktur. Boşluğun tanımı budur. Başka bir yerde kullanmak için gerçek bir değer (ör. Bir String) döndürmeniz gerekir. –

+0

Anladığım kadarıyla, burada sorun olan sorun. Yinelemeli bir döngüde bir dizgiyi nasıl iade etmem gerektiğine dair ipuçlarınız var mı? – Ripha

+0

"C++ ve Python için kullanıyorum, ki bu problemin çözümünde, birleşik kombinasyonun sonucunu vererek bir listedeki kombinasyonları toplamak çok daha kolay." Bununla ne demek istediğini merak ediyorum. Aynı şeyi Java'da da yapabilmelisiniz. Kombinasyon için – DavidS

cevap

1

Yapmak istediğiniz şey son sonucu (dizge) döndürmekse, tüm kodu yinelemeli yordamınızdan başka bir yardımcı yönteme atayabilir ve başlangıç ​​yönteminin yardımcıyı çağırıp sonucu döndürmesini sağlayabilirsiniz. Elbette, sonuçların geri dönüş yoluyla iletilmesi için hem özyineli yardımcı hem de yönteminizin geçersiz olmaması gerekir.

+1

Bu, örnek kodla daha yararlı olur. – DavidS

1

Değişim dönüş List<String> için yöntemin tipi ve listeye değerleri ekleyin: Alternatif

public static List<String> combinationAssShit(String arr[], String data[], int start, int end, int index, int r){ 
    List<String> result = new ArrayList<>(); 
    if (index == r) { 
    StringBuilder sb = new StringBuilder(); 
    for (int j=0; j<r; j++) { 
     sb.append(data[j]); 
     sb.append(" "); 
    } 
    result.add(sb.toString()); 
    } else { 
    for (int i=start; i<=end && end-i >= r-index; i++) 
    { 
     data[index] = arr[i]; 
     result.addAll(combinationAssShit(arr, data, i+1, end, index+1, r)); 
    } 
    } 
    return result; 
} 

, sen yönteme parametre olarak List<String> ekleyebilir, böylece tutmak gerekmez Yeni örnekler yaratma:

public static void combinationAssShit(
    String arr[], String data[], int start, int end, int index, int r, 
    List<String> result){ 
+0

"... ... Listesini bir parametreye ekleyebilirsiniz ..." Tekrar eden programlamada bu bazen "akümülatör" değişkeni olarak adlandırılır. – DavidS