2013-02-18 18 views
9

Bir dizideki karakterlerden olası tüm karakter kombinasyonlarını alan özyinelemeli bir yöntem yazdım. Java bunu test ederkenÖzyineleme yöntemi, java'da konsolla birlikte çalışır, ancak android ile değil

public static void uns(String word, StringBuilder s, List combos) 
{ 
    for(char c: word.toCharArray()) 
    { 
     s.append(c); 
     if(word.length() != 1) 
      { 
      uns(removeChar(word, c),s,combos); 
      } 
     else 
     { 
      combos.add(s.toString()); 
     } 
     s.deleteCharAt(s.toString().length()-1); 
    } 

} 

public static List getCombinations(String word) 
{ 
    List<String> combinations = new ArrayList<String>(); 
    uns(word,new StringBuilder(),combinations); 
    return combinations; 
} 

public static String removeChar(String s, char c) 
{ 
    int index = s.indexOf(c); 
    return s.substring(0,index)+s.substring(index+1); 
} 

, hiç kusurları ile koştu: Ben de erişmek ve kombinasyonların listesini döndürmek için bir yöntem var. Bazı nedenlerden dolayı, Android'de kullandığımda, liste doğru sayıda öğe ile doldurulur, ancak her öğe aynıdır. Örneğin, "burada" kelimesi için "eerh" ile dolu bir liste döndürür.

+0

'removeChar()' nedir? – Eric

+0

@Eric Üzgünüm, tekrar düzenleyin. – Wilson

cevap

9

Bu çok garip bir aksaklık (kesinlikle tekrarlanabilir) ve bununla ilgili bir hata raporu göndermek isteyebilirsiniz. Bununla birlikte, işte geçici bir geçici çözümdür; bir şekilde referansı yeniden kullanmak için görünen .toString() kullanmak yerine (bunlarla .substring(0) yapsam bile), bunların tümü güncellenir; Her yinelemeden sonra listeyi yazdırırsanız, ne demek istediğimi görürsünüz.

İşte benim hacky/verimsiz çözümüm. Değişim:

combos.add(s.toString()); 

... için: onlar manipüle edilmez, böylece

combos.add(s + ""); 

Bu etkin, diziye düzgün dize klonlar:

02-17 19:33:48.605: I/System.out(6502): [Combos]: [here, heer, hree, hree, here, heer, ehre, eher, erhe, ereh, eehr, eerh, rhee, rhee, rehe, reeh, rehe, reeh, ehre, eher, erhe, ereh, eehr, eerh]

+0

+1 bunu denemek için * ve * bir çözüm ile geliyor! –

+1

@ A - C Denemek zorundaydım; Onu kendi gözlerimle görmeden inanamadım. :) – Eric

+0

@Eric Harika, derinlemesine cevap. Teşekkürler. – Wilson

0

Olumlu değil ama string clas'tan valueOf() yöntemini düşünüyorum s de çalışacak. belki StringBuilder yerine bir liste kullanmayı deneyin, listeye karakter ekleyin ve String.valueOf (s.get (i)); ve bu karakteri bir dizgeye dönüştürmeli. Android'de neden işe yaramadığını anlayamıyorum, ancak döngüsünü biraz değiştirmeniz gerekebilir. umarım yardımcı olur.

+0

Hayır, .valueOf() ile aynı hata. 'String.valueOf (StringBuilder) 'dır, sadece OP'nin koduyla aynı olan' StringBuilder.toString() 'öğesini döndürür. – Eric

İlgili konular