2013-02-18 5 views
9

Ich schrieb eine rekursive Methode, die alle möglichen Zeichenkombinationen aus den Zeichen in einer Zeichenfolge erhält. Ich habe auch eine Methode für den Zugriff und eine Liste der Combos zurück:Rekursive Methode funktioniert in Java mit Konsole, aber nicht mit Android

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

Wenn es in Java zu testen, ist es ohne Fehler lief. Aus irgendeinem Grund, wenn ich es in Android verwende, wird die Liste mit der richtigen Anzahl von Elementen gefüllt, aber jedes Element ist das gleiche. Zum Beispiel gibt es für das Wort "hier" eine Liste zurück, die mit "Eerh" gefüllt ist.

+0

Was ist die Definition von 'removeChar()'? – Eric

+0

@Eric Sorry, zurück bearbeitet. – Wilson

Antwort

9

Dies ist ein sehr seltsamer Fehler (definitiv reproduzierbar) und Sie können einen Fehlerbericht hierüber einreichen.

Hier ist jedoch eine temporäre Problemumgehung; anstelle von .toString(), die irgendwie die Referenz wieder zu verwenden scheint (auch wenn ich .substring(0) damit mache), so werden alle von ihnen aktualisiert; Wenn Sie die Liste nach jeder Iteration ausdrucken, werden Sie sehen, was ich meine.

Hier ist meine hacky/ineffiziente Lösung. Wechsel:

combos.add(s.toString()); 

... bis:

combos.add(s + ""); 

Diese Klone effektiv die Zeichenfolge richtig in das Array, so dass sie nicht manipuliert werden:

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 für den Versuch, dies selbst * und * mit einer Lösung zu kommen! –

+1

@ A - C Ich musste es versuchen; Ich konnte es nicht glauben, ohne es mit meinen eigenen Augen zu sehen. :) – Eric

+0

@Eric Große, eingehende Antwort. Vielen Dank. – Wilson

0

Ich bin nicht positiv, aber ich denke, die ValueOf() -Methode aus der Zeichenfolge Clas s wird auch funktionieren. Versuchen Sie vielleicht, eine Liste anstelle des StringBuilders zu verwenden, fügen Sie Zeichen zur Liste hinzu und versuchen Sie String.valueOf (s.get (i)); und das sollte das Zeichen in eine Zeichenfolge konvertieren. Ich sehe nicht, warum Out in Android nicht funktioniert, aber Sie müssen möglicherweise Ihre Schleife ein wenig ändern. Ich hoffe, das hilft.

+0

Nein, derselbe Fehler mit '.valueOf()'. Ich denke, 'String.valueOf (StringBuilder)' gibt nur 'StringBuilder.toString()' zurück, was dem Code des OPs entspricht. – Eric

Verwandte Themen