2013-11-24 2 views
2

Допустим, вход C3F5G10как разобрать строку, содержащую целые числа и числа

я знаю, за то, что каждый четное число является символом, и каждый нечетное число является целым числом. Однако это работает только в том случае, если целое число равно одной цифре. В этом случае его нет, поскольку 10 читается как два отдельных элемента.

Как мне обойти эту ситуацию? в основном на выходе будет только распечатать количество символов, которое находится рядом с целыми

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. В следующий раз, когда вы встретите персонажа, вы можете напечатать предыдущий найденный символ, charToPrint, num раз. После этого назначьте 0 на num.
Надеюсь, что вам помогут.

0

Try,

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

@ Масуд да, я исправил его и разместил правильный ответ. Спасибо за указание на это – 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); 
} 
Смежные вопросы