2013-11-24 11 views
2

比方說輸入的是C3F5G10如何解析包含整數和數字

我知道一個事實,即每隔偶數是一個字符,每一個奇數是一個整數,字符串。但是,這隻適用於如果整數是一個數字。在這種情況下它不是,因爲10被看作是一個2個獨立的元素。

我該如何解決這種情況?基本上輸出將只打印字符數是整數旁邊

CCCFFFFFGGGGGGGGGG

public static String translate(String formatStr) { 
     char [] array = formatStr.toCharArray(); 
    char [] carray = new char[array.length/2]; 
    char [] narray = new char[array.length/2]; 
    StringBuilder build1 = new StringBuilder(); 



    int m = 0; 
    for(int i = 0; i<carray.length; i++){ 
     carray[i] = array[m]; 
     m+=2; 
    } 
    int l =1; 
    for(int i = 0; i<narray.length; i++){ 
     narray[i] = array[l]; 
     l+=2; 
    } 



    for(int i = 0; i < carray.length; i++){ 
     String number = Character.toString(narray[i]); 
     for(int j=0;j<Integer.parseInt(number);j++){ 
      build1.append(carray[i]); 
     } 

     } 

    return build1.toString(); 
} 
+5

哦,我剛纔看到一個問題就這樣。這就像你們都來這裏尋求編程幫助。 – SimplyPanda

+3

我想問一個相關的問題是「你試過了什麼?」 – SimplyPanda

+2

我認爲你的人有同樣的功課 http://stackoverflow.com/questions/20171289/why-my-java-code-doesnt-work/20171350?noredirect=1#comment30070562_20171350 –

回答

0

正如我堅信,只有這樣的人能學到一些東西是他自己做的,我會提供你有一些見解,你會自己編碼。
保留一個包含臨時編號的變量,如num。將字符串從左至右讀入名爲currentChar的變量char by char。如果當前字母是字符,那麼你知道你需要打印什麼;將其保存在變量charToPrint中。如果是數字,則進行以下更改:num = num * 10 + <convert-your-character-to-integer> currentChar。下一次遇到角色時,您可以打印先前找到的角色,charToPrintnum次。之後,將0分配給num。
希望能幫到你。

0

嘗試,

public static String translate(String word) { 
    StringBuilder res = new StringBuilder(); 
    char let = ' '; 
    String num = ""; 
    for (int i = 0; i < word.length(); i++) { 
     char ch = word.charAt(i); 
     if (Character.isDigit(ch)) { 
      num += ch; 
     } else if (Character.isLetter(ch)) { 
      if (num.length() > 0) { 
       for (int j = 0; j < Integer.parseInt(num); j++) { 
        res.append(let); 
       } 
      } 
      let = ch; 
      num = ""; 
     } 
    } 
    if (num.length() > 0) { 
     for (int j = 0; j < Integer.parseInt(num); j++) { 
      res.append(let); 
     } 
    } 
    return res.toString(); 
    } 
0

看看這個實現。我希望它有幫助。

public class Test { 

public static void main(String[] args) { 

    String input = "C3F5G10"; 
    StringBuilder sBuilderChar = new StringBuilder(); 
    String digit = ""; 
    for (int i = 0; i < input.length(); i++) { 
     if (isCharacter(input.charAt(i))) { 
      int k = i;// store index of character. 
      // loop until the next character is not encountered 
      // form a string of all the digits sandwiched between two 
      // characters 
      while (k < input.length() - 1 && isDigit(input.charAt(k + 1))) { 
       digit = digit + input.charAt(k + 1); 
       k++; 
      } 
      // convert the digit string to number 
      int n = Integer.parseInt(digit); 
      // append the character the number of times calculated 
      // previously 
      for (int j = 0; j < n; j++) { 
       sBuilderChar.append(input.charAt(i)); 
      } 
      // skip all the digits and move to next character 
      // i.e. current index + the length of digit obtained 
      i = i + digit.length(); 
      // empty the digit string 
      digit = ""; 
     } 

    } 
    // print the string formed to console 
    System.out.println(sBuilderChar); 

} 

public static boolean isDigit(char c) { 
    // digits are in the range [48,57] in ASCII code 
    return c >= 48 && c <= 57; 
} 

public static boolean isCharacter(char c) { 
    // if not digit then 'c' is a character 
    return !isDigit(c); 
} 

} 
+0

它應該打印'CCCFFFFFGGGGGGGGGG'而不是'CFG'。 – Masudul

+0

@Masud是的,我已糾正它併發布正確的答案。感謝您指出它 – Nishant

0

這是我的解決方案。似乎工作。 int tmp=0這幾行對你很有幫助。這是我如何處理一個字符後的多個數字。

import java.io.PrintWriter; 
import java.util.Scanner; 

public class QuestionTwo { 
    public static void main(String[] args) { 
    PrintWriter out = new PrintWriter(System.out); 
    Scanner sc = new Scanner(System.in); 

    char[] input = sc.nextLine().trim().toCharArray(); 

    StringBuilder ans = new StringBuilder(""); 
    int i = 0; 
    while (true) { 
     if (i > input.length - 1) 
     break; 
     // Has to be a character. 
     char c = input[i]; 
     i++; 
     int tmp = 0; 
     while (i < input.length && Character.isDigit(input[i])) { 
     tmp *= 10; 
     tmp += input[i] - '0'; 
     i++; 
     } 
     while (tmp-- > 0) 
     ans.append(c); 
    } 
    out.println(ans.toString()); 
    out.close(); 
    sc.close(); 
    } 
} 
0

如果你想使用正則表達式,那麼這裏是一個辦法......

public static String translate(String formatStr) { 
    StringBuilder result = new StringBuilder(); 
    //make sure it really contains just alphanumeric 
    if(formatStr.matches("^[a-zA-Z0-9]*$")) { 
     String alphas[] = removeInvalid(formatStr.split("[0-9]")); 
     String numerics[] = removeInvalid(formatStr.split("[a-zA-Z]")); 
     int alphaPointer = 0; 
     for(String num: numerics) { 
      int iterator = Integer.valueOf(num); 
      for(int i=0; i< iterator; i++) { 
       result.append(alphas[alphaPointer]); 
      } 
      alphaPointer++; 
     } 
    } 
    return result.toString(); 

} 

/* 
* Remove empty results from the regex split 
*/ 
private static String[] removeInvalid(String[] values) { 
    ArrayList<String> list = new ArrayList<String>(); 
    for(String value: values) { 
     if(value.matches("\\d+") || value.matches("\\w+")) 
      list.add(value); 
    } 
    String[] valids = new String[list.size()]; 
    return list.toArray(valids); 
}