2016-02-19 1 views
0

У меня есть строковое множество, «5X3I3M3X»Java отдельная строка из одной строки

Я хочу, чтобы отделить 5й = 1X1X1X1X1X, зависит от числа перед символом «X»

И в конце концов это может быть 1X1X1X1X1X3I3M1X1X1X

Я сделал это, как показано ниже,

String str = "5X3I3M3X"; 
    StringBuffer sBuffer = new StringBuffer(""); 

    for(int i = 1 ; i < str.length() ; i=i+2) { 
     if(str.charAt(i) == 'X'){ 

      if(str.charAt(i-1) == 1){ 
       sBuffer.append(str.charAt(i-1)+""+str.charAt(i)); 
      }else{ 
       StringBuffer sBufferTemp = new StringBuffer(""); 

       for(int j=0 ; j < Character.getNumericValue(str.charAt(i-1)) ; j++){ 
        sBufferTemp.append("1X"); 
       } 

       sBuffer.append(sBufferTemp.toString()); 
      } 
     } else { 
      sBuffer.append(str.charAt(i-1)+""+str.charAt(i)); 
     } 
    } 
    System.out.println(sBuffer.toString()); 

И я хочу знать, есть ли простой способ отделить эту логику? примечание. Если я хочу добавить к отдельному «I», тогда он должен динамически меняться так же, как «1X1X1X1X1X1I1I1I3M1X1X1X»

Я могу изменить его мой код extpend if (str.charAt (I) == 'I') ...

Надеюсь, есть еще один простой способ реализовать это.

ответ

1

После вашего кодирования решение, я предлагаю следующие изменения:

String str = "5X3I3M3X"; 
StringBuilder sBuffer = new StringBuilder(); 
for (int i = 0; i < str.length(); ++i) { 
    if (i + 1 < str.length() 
      && str.charAt(i + 1) == 'X' 
      && str.charAt(i) != '1' 
      && Character.isDigit(str.charAt(i))) { 
     int n = Character.getNumericValue(str.charAt(i)); 
     for (int j = 0 ; j < n; ++j) { 
      sBufferTemp.append("1X"); 
     } 
     ++i; 
    } else { 
     sBuffer.append(str.charAt(i)); 
    } 
} 
  • использовать новые и быстрее StringBuilder вместо StringBuffer
  • Петля через все i, поэтому добавление в дефо Это случай прямолинейный
  • Условие может быть более полным, проверка на '1' не требуется.
  • символом «1» должен быть сравнены, а не 1.
1

Вы можете передать настраиваемый массив символов в метод. С помощью этой конфигурации вы можете проверить, может ли текущий символ расширяться.

Выход из программы ниже:

1X1X1X1X1X1I1I1I1M1M1M1X1X1X 
public class StringExpander { 
    public static void main(String[] args) { 
     System.out.println(expand("5X3I3M3X", new char[] { 'X', 'I', 'M' })); 
    } 

    public static String expand(String str, char[] chArr) { 
     StringBuffer buff = new StringBuffer(); 
     for (int i = 1; i < str.length(); i = i + 2) { 
      char ch = str.charAt(i); 
      if (contains(chArr, ch)) { 
       if (str.charAt(i - 1) == 1) { 
        buff.append(str.charAt(i - 1)).append(str.charAt(i)); 
       } else { 
        StringBuffer tempBuff = new StringBuffer(); 
        int repeat = Character.getNumericValue(str.charAt(i - 1)); 
        for (int j = 0; j < repeat; j++) { 
         tempBuff.append(1).append(ch); 
        } 
        buff.append(tempBuff); 
       } 
      } else { 
       buff.append(str.charAt(i - 1)).append(ch); 
      } 
     } 
     return buff.toString(); 
    } 

    private static boolean contains(char[] arr, char val) { 
     for (char ch : arr) { 
      if (ch == val) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 
0

Я знаю, что это не совсем синтаксический сахар вообще ..

String str = "5X3I3M3X"; 
char[] filter = new char[]{'X', 'I', 'M'}; 
StringBuffer stringBuffer = new StringBuffer(""); 

for (int i = 0; i < str.length(); i++) { 
    if (i != 0 && new String(filter).contains(Character.toString(str.charAt(i))) && Character.isDigit(str.charAt(i-1))) { 
     for (int j = 0; j < Character.getNumericValue(str.charAt(i-1)); j++) { 
      stringBuffer.append("1" + str.charAt(i)); 
     } 
    } else if (i < str.length()-1 && new String(filter).contains(Character.toString(str.charAt(i+1)))) { 
     //do nothing 
    } 
    else { 
     stringBuffer.append(str.charAt(i)); 
    } 
} 
Смежные вопросы