Сокращение представления строки путем добавления количества последовательных символов - PullRequest
0 голосов
/ 02 февраля 2020

Учитывая случайную строку символов, не включающую (0-9), мне нужно сократить представление этой строки, добавив количество последовательных символов. Например, ggee приведет к отображению g2e2.

Мне удалось реализовать программу и протестировать ее (работает правильно) с помощью различных входов. Я столкнулся с проблемой, из-за которой я не могу понять, как отображается символ «е», учитывая введенные выше данные.
Я проследил свой код несколько раз, но не вижу, когда / как отображается «e», когда «i» равно 2 / 3.

String input = new String("ggee");
char position = input.charAt(0);
int accumulator = 1;
for (int i = 1; i < input.length(); i++)
{
    // Correction. Was boolean lastIndexString = input.charAt(i) == (input.charAt(input.length() - 1));
    boolean lastIndexString = i == (input.length() - 1); 
    if (position == input.charAt(i))
    {
        accumulator++;
        if (lastIndexOfString)
            System.out.print(accumulator); // In my mind, I should be printing 
                                           // (input.charAt(i) + "" + accumulator); here
    }
    else //(position != input.charAt(i))
    {
        if (accumulator > 1)
        {
            System.out.print(position + "" + accumulator);
        }
        else
        {
            System.out.print(position + "");
        }
        position = input.charAt(i);
        accumulator = 1;

        if (lastIndexOfString)
           System.out.print(input.charAt(i)); // This is always printing when 
                                              //  I am at the last index of my string, 
                                              //  even ignoring my condition of 
                                              //  (position == input.charAt(i))
    }
}

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

В Java 9+, используя регулярное выражение для поиска последовательных символов, будет делать следующее:

static String shorten(String input) {
    return Pattern.compile("(.)\\1+").matcher(input)
            .replaceAll(r -> r.group(1) + r.group().length());
}

Тест

System.out.println(shorten("ggggeecaaaaaaaaaaaa"));
System.out.println(shorten("ggggee???????"));

Вывод

g4e2ca12
g4e2?6?8

Однако, как вы можете видеть, этот код не работает, если входная строка содержит символы Unicode из дополнительных плоскостей, например символы Emoji.

Небольшая модификация исправит это:

static String shorten(String input) {
    return Pattern.compile("(.)\\1+").matcher(input)
            .replaceAll(r -> r.group(1) + r.group().codePointCount(0, r.group().length()));
}

Или:

static String shorten(String input) {
    return Pattern.compile("(.)\\1+").matcher(input)
            .replaceAll(r -> r.group(1) + input.codePointCount(r.start(), r.end()));
}

Выход

g4e2ca12
g4e2?3?4
0 голосов
/ 02 февраля 2020

По сути, вам нужен каждый символ без повторов.

*******************************************************************************/

public class Main
{
    public static void main(String[] args) {
    String s="ggggggeee";
        StringBuilder s1=new 
         StringBuilder("") ;
           ;




       for(int i=0;i<s.length();i++)
      {
     int count=0,j;
        for( j=i+1;j<s.length();j++)
        {
       if(s.charAt(i)==s.charAt(j))
       count++;
       else 
         {
             break;}
        } 
        i=j-1;
     s1=s1.append(s.charAt(i)+""+(count+1));


       } 

       System.out.print(s1);



}}

Выход

enter image description here

enter image description here

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