Как разбить строку при каждом n-м появлении символа в Java

1

Я хотел бы разделить строку на каждом 4 возникновении запятой ,.

Как это сделать? Ниже приведен пример:

String str = "1,,,,,2,3,,1,,3,,";

Expected output:
array[0]: 1,,,,
array[1]: ,2,3,,
array[2]: 1,,3,,

Я попытался использовать Google Guava следующим образом:

Iterable<String> splitdata = Splitter.fixedLength(4).split(str);
output: [1,,,, ,,2,, 3,,1, ,,3,, ,]

Я также пробовал:

String [] splitdata = str.split("(?<=\\G.{" + 4 + "})");
output: [1,,,, ,,2,, 3,,1, ,,3,, ,]

Но это не тот результат, который я хочу. Я просто хочу разбить строку на каждом четвертом введении запятой.

Благодарю.

  • 1
    Какой вопрос. Мы понимаем ваши требования и полагаем, что вы попытались решить проблему. Пожалуйста, опишите вашу попытку, разместив код и объясните, в чем проблема.
  • 1
    используйте цикл и считайте запятую, и используйте условие, если count = 4, затем сбросьте счетчик и добавьте следующую строку в массив
Показать ещё 4 комментария
Теги:
string
arrays
split

3 ответа

1
Лучший ответ

Возьмите две переменные int. Один из них - считать no of ','. Если "," происходит, счет будет перемещаться. И если счет идет до 4, то сбрасывает его на 0. Другое значение int указывает, что оттуда строка будет отключена. он начнется с 0 и после того, как будет обнаружена первая строка, конечная точка (позиция символа в строке) будет первой точкой следующего. Используйте эту начальную точку и текущую конечную точку (i + 1, так как после появления события значение я будет увеличено). Наконец, добавьте строку в список массивов. Это пример кода. Надеюсь, что это поможет вам. Извините за мой плохой английский.

String str = "1,,,,,2,3,,1,,3,,";
int k = 0;
int startPoint = 0;
ArrayList<String> arrayList = new ArrayList<>();
for (int i = 0; i < str.length(); i++)
{
  if (str.charAt(i) == ',')
  {
      k++;
      if (k == 4)
      {
          String ab = str.substring(startPoint, i+1);
          System.out.println(ab);
          arrayList.add(ab);
          startPoint = i+1;
          k = 0;
      }
  }
}
1

Здесь более гибкая функция, использующая идею из этого ответа:

static List<String> splitAtNthOccurrence(String input, int n, String delimiter) {
    List<String> pieces = new ArrayList<>();
    // *? is the reluctant quantifier
    String regex = Strings.repeat(".*?" + delimiter, n);
    Matcher matcher = Pattern.compile(regex).matcher(input);

    int lastEndOfMatch = -1;
    while (matcher.find()) {
        pieces.add(matcher.group());
        lastEndOfMatch = matcher.end();
    }
    if (lastEndOfMatch != -1) {
        pieces.add(input.substring(lastEndOfMatch));
    }
    return pieces;
}

Так вы называете это с помощью вашего примера:

String input = "1,,,,,2,3,,1,,3,,";
List<String> pieces = splitAtNthOccurrence(input, 4, ",");
pieces.forEach(System.out::println);
// Output:
// 1,,,,
// ,2,3,,
// 1,,3,,

Я использую Strings.repeat из Guava.

0

попробуйте также, если вы хотите получить результат в массиве

    String str = "1,,,,,2,3,,1,,3,,";
    System.out.println(str);
    char c[] = str.toCharArray();
    int ptnCnt = 0;
    for (char d : c) {
        if(d==',')
            ptnCnt++;
    }
    String result[] = new String[ptnCnt/4];
    int i=-1;
    int beginIndex  = 0;
    int cnt=0,loopcount=0;
    for (char ele : c) {
        loopcount++;
        if(ele==',')
            cnt++;
        if(cnt==4){
            cnt=0;
            result[++i]=str.substring(beginIndex,loopcount);
            beginIndex=loopcount;
        }
    }
    for (String string : result) {
        System.out.println(string);
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню