2013-02-18 15 views
9

Napisałem metodę rekursywną, która pobiera wszystkie możliwe kombinacje znaków ze znaków w ciągu znaków. Mam też metody do niego dostęp i zwróci listę combo:Metoda rekursywna działa w java z konsolą, ale nie z Androidem

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); 
} 

Podczas testowania go w Javie, to biegł bez wad. Z jakiegoś powodu, kiedy używam go w Androidzie, lista jest wypełniona odpowiednią liczbą elementów, ale każdy element jest taki sam. Na przykład dla słowa "tutaj" zwraca listę wypełnioną "eerh".

+0

Jaka jest definicja 'removeChar()'? – Eric

+0

@Eric Przepraszamy, edytujemy ponownie. – Wilson

Odpowiedz

9

To bardzo dziwna usterka (zdecydowanie odtwarzalna) i możesz złożyć raport o błędzie na ten temat.

Jednak tutaj jest tymczasowe obejście; zamiast używać .toString(), który wydaje się jakoś ponownie wykorzystać referencję (nawet jeśli robię z nią .substring(0)), więc wszystkie z nich zostaną zaktualizowane; jeśli wydrukujesz listę po każdej iteracji, zobaczysz co mam na myśli.

Oto moje hacky/nieskuteczne rozwiązanie. Zmiana:

combos.add(s.toString()); 

... do:

combos.add(s + ""); 

To skutecznie klonuje ciąg odpowiednio do tablicy, tak, że nie są manipulowane:

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 za samodzielne wypróbowanie * i * wymyślanie rozwiązania! –

+1

@ A - C Musiałem spróbować; Nie mogłem w to uwierzyć, nie widząc tego na własne oczy. :) – Eric

+0

@Eric Świetnie, do głębi odpowiedz. Dzięki. – Wilson

0

Nie jestem pozytywny, ale myślę, że metoda valueOf() z klas łańcuchowych s też będą działać. może spróbuj użyć listy zamiast StringBuilder, dodaj znaki do listy i wypróbuj String.valueOf (s.get (i)); i to powinno przekonwertować znak na ciąg znaków. Nie rozumiem, dlaczego nie działa w systemie Android, ale może trzeba trochę zmodyfikować pętlę. mam nadzieję, że pomaga.

+0

Nie, ten sam błąd z '.valueOf()'. Myślę, że 'String.valueOf (StringBuilder)' zwraca tylko 'StringBuilder.toString()', który jest taki sam jak kod OP. – Eric

Powiązane problemy