2015-08-02 21 views
6

Per favore aiutami, voglio passare dalla stringa AABSSSD per essere 2AB3SD (qualcuno lo chiamava crittografia). Ecco come ho risolverlo:Trasforma la stringa "AABSSSD" in "2AB3SD"

public class TransformString { 

    public static void main(String[] args) { 
     String str = "AABSSSD"; 
     StringBuilder newStr = new StringBuilder(""); 
     char temp = str.charAt(0); 
     int count = 0; 
     for (int i = 0; i < str.length(); i++) { 
      if (temp == str.charAt(i)) { 
       count++; 
      } else { 
       newStr.append(count); 
       newStr.append(temp); 
       count = 0; 
      } 
      temp = str.charAt(i); 
      if(i == (str.length() - 1)){ 
       newStr.append(str.charAt(i)); 
      } 
     } 
     String x = String.valueOf(newStr); 
     x = x.replace("0", ""); 
     System.out.print(x); 
    } 
} 

ma l'uscita è,

2AB2SD 

Questo risultato non è esattamente l'aspetto che voglio.

Per favore aiutami a trasformare "AABSSSD" in "2AB3SD".

risposta

3

Nella tua else parte si dovrebbe impostare contatore 1 invece di 0 come nuovo personaggio sta avendo la sua prima occorrenza,

else { 
    newStr.append(count); 
    newStr.append(temp); 
    count = 1;//Just change this 
} 

e sostituire 1 invece di 0 dalla Stringx = x.replace("1", ""); perché 0A non sembra valido A si è verificato una volta nel String quindi dovrebbe essere 1A anziché 0A.

1

La tua parte else è errata. Si prega di modificarlo come:

newStr.append(count); 
newStr.append(temp); 
count = 1; 

invece di:

newStr.append(count); 
newStr.append(temp); 
count = 0; 
1

Che dire di un po 'di Java 8? :-)

String str = "AABSSSD"; 
String x = Arrays.stream(str.split("")) 
    .collect(Collectors.groupingBy(Function.identity())).values().stream() 
    .map(l -> (l.size() > 1 ? l.size() : "") + l.get(0)) 
    .collect(Collectors.joining()); 
System.out.println(x);