Как заменить каждый n-й символ x из строки - PullRequest
0 голосов
/ 14 мая 2018

Мой вопрос: как заменить каждый третий ';'из строки a положить ',' в этой позиции?

, например:

1004 *

, чтобы строка выглядела так:

RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53

Я пыталсячтобы решить это следующим образом, но я не могу взять charAt (i) и заменить его другим символом.

int counter =0;
for (int i=0;i<s.length();i++){
    if(s.charAt(i) == ';'){

    counter++;
    }
    if(counter ==3){
    s.charAt(i)=',';
    counter =0;
    }


}

Ответы [ 4 ]

0 голосов
/ 14 мая 2018

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

Первый - самый простой, с точки зрения кода, если вы знаете регулярное выражение. См. ответ Joop Eggen для объяснения.

Второй, вероятно, самый быстрый, особенно если вы исключите оператор % по модулю, сбросив вместо j значение 0.

private static String usingRegex(String s) {
    return s.replaceAll("([^;]*;[^;]*;[^;]*);", "$1,");
}

private static String usingCharArray(String s) {
    char[] arr = s.toCharArray();
    for (int i = 0, j = 0; i < arr.length; i++)
        if (arr[i] == ';' && ++j % 3 == 0)
            arr[i] = ',';
    return new String(arr);
}

private static String usingStringBuilder(String s) {
    StringBuilder sb = new StringBuilder(s);
    for (int i = 0, j = 0; i < sb.length(); i++)
        if (sb.charAt(i) == ';' && ++j % 3 == 0)
            sb.setCharAt(i, ',');
    return sb.toString();
}

private static String usingSubstring(String s) {
    int i = -1, j = 0;
    while ((i = s.indexOf(';', i + 1)) != -1)
        if (++j % 3 == 0)
            s = s.substring(0, i) + ',' + s.substring(i + 1);
    return s;
}

Тест

String s = "RED;34;34;BLUE;44;44;GREEN;8;8;BLUE;53;53";
System.out.println(usingRegex(s));
System.out.println(usingCharArray(s));
System.out.println(usingStringBuilder(s));
System.out.println(usingSubstring(s));

выход

RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
0 голосов
/ 14 мая 2018

Не такой элегантный, как у @Joop, но, вероятно, проще для понимания:

String s = "RED;34;34;BLUE;44;44;GREEN;8;8;BLUE;53;53";
char[] chars = s.toCharArray();
int counter = 1;
for (int i = 0; i < chars.length; i++){
   if (chars[i] == ';'){
      if (counter == 3){
         chars[i] = ','; // replace ';' with ','
         counter = 1;    // set counter to 1
      }else {
         counter++;
      }
   }
}
String output = String.valueOf(chars);
System.out.println(output); // RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
0 голосов
/ 14 мая 2018

Вы можете использовать оператор по модулю%, чтобы знать, что в третий раз что-то происходит.И простое преобразование между строкой и массивом символов, чтобы сделать остальное:

class Main {

    public static void main(String[] args) {    
        String s1 = "RED;34;34;BLUE;44;44;GREEN;8;8;BLUE;53;53";
        char [] s = s1.toCharArray();
        int j=0;
        for(int i=0;i<s.length;i++){    
        if (s[i]==';') {
           j++;    
           if(j % 3 == 0) {    
             s[i] = ',';    
          }     
       }
     }
    System.out.println(s);
  }
}
0 голосов
/ 14 мая 2018

Обычно от вопроса требуются собственные усилия, но регулярное выражение сложно.

s = s.replaceAll("([^;]*;[^;]*;[^;]*);", "$1,");

Последовательность из 0 или более точек без запятой, за которой следует точка с запятой и т. Д.

[^ ...characters... ] - это некоторый символ , не в списке.

...* - ноль или более непосредственно предшествующего совпадения.

Совпадение 1-й группы (...) указано в $1, поэтому на самом деле только последняя точка с запятой заменяется запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...