Разделение этой строки, чтобы получить максимальное количество для соответствующего символа - PullRequest
0 голосов
/ 18 мая 2019

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

Допустим, у нас есть строка в качестве ввода

"AAAAABBBBCCCCCCCC"

тогда мой алгоритм возвращает

"1A2A3A4A5A1B2B3B4B1C2C3C4C5C6C7C8C"

Теперь я хочу применить Java String split для решения этой проблемы, потому что я хочу получить наибольшее число, соответствующее символу. Для нашего примера это будет

"5A4B8C"

Мою функцию можно увидеть ниже

public String getStrfinal(){

    String result = "";
    int counter = 1;
    StringBuilder sb = new StringBuilder();
    sb.append("");
    for (int i=0;i<str.length()-1;i++) {
        char c = str.charAt(i);
        if (str.charAt(i)==str.charAt(i+1)) {
            counter++;
            sb.append(counter);
            sb.append(c);
        }
        else {
            counter = 1;
            continue;
        }
    }
    result = sb.toString();
    return result;
}

Ответы [ 4 ]

1 голос
/ 18 мая 2019
public static String getStrfinal(){

    StringBuilder sb = new StringBuilder();

    char last = 0;
    int count = 0;
    for(int i = 0; i < str.length(); i++) {

        if(i > 0 && last != str.charAt(i)) {
            sb.append(count + "" + last);
            last = 0;
            count = 1;
        }
        else {
            count++;
        }

        last = str.charAt(i);

    }
    sb.append(count + "" + last);
    return sb.toString();
}
1 голос
/ 18 мая 2019

Вот одно из возможных решений.Он начинается с необработанной строки и просто проходит по ней.

   public static void main(String[] args) {
      String input = "AAAABBBCCCCCCCDDDEAAFBBCD";
      int index = 0;
      StringBuilder sb = new StringBuilder();
      while (index < input.length()) {
         int count = 0;
         char c = input.charAt(index);
         for (; index < input.length(); index++) {
            if (c != input.charAt(index)) {
               count++;
            }
            else {
               break;
            }
         }
         sb.append(Integer.toString(count));
         sb.append(c);
         count = 0;
      }
      System.out.println(sb.toString());
   }

Но одна проблема с этим и другими методами заключается в том, что произойдет, если в тексте есть цифры?Например.Что если строка будет AAABB999222AAA, которая будет сжата до 3A2B39323A.Это также может означать AAABB, за которыми следуют 39 3's и 23 A's

1 голос
/ 18 мая 2019

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

public static void main(String[] args)  {   
    String input = "AAAAABBBBCCCCCCCCAAABBBDDCCCC";
    int counter=1;
    for(int i=1; i<input.length(); i++) {
        if(input.charAt(i-1)==input.charAt(i)) {
            counter=counter+1;
        }else if(input.charAt(i-1)!=input.charAt(i)){
            System.out.print(counter+Character.toString(input.charAt(i-1)));
            counter=1;
        }if(i==input.length()-1){
            System.out.print(counter+Character.toString(input.charAt(i)));
        }
    }   
}

Это даст

5A4B8C3A3B2D4C

ОБНОВЛЕНИЯ
Я согласен с @WJS, если строка содержит число, выход которого становится грязным, следовательно, если System.out в вышеприведенном коде будет заменен ниже, т.е.

System.out.print(Character.toString(input.charAt(i-1))+"="+counter+" ");

, то для ввода типа

AAAAABBBBCCCCCCCCAAABBBDD556677CCCCz

мы выходим, как показано ниже

A=5 B=4 C=8 A=3 B=3 D=2 5=2 6=2 7=2 C=4 z=1
0 голосов
/ 23 мая 2019

Это одно из возможных решений вашего вопроса. Мы можем использовать структуру данных LinkedHashMap, которая похожа на HashMap, но также поддерживает порядок. Таким образом, мы можем пройти строку и сохранить вхождение каждого символа в виде пары ключ-значение на карту и легко извлечь ее с максимальным вхождением.

public String getStrFinal(String str){
    if(str==null || str.length()==0) return str;
    LinkedHashMap<Character,Integer> map = new LinkedHashMap<>();
    StringBuilder sb=new StringBuilder(); // to store the final string
    for(char ch:str.toCharArray()){
        map.put(ch,map.getOrDefault(ch,0)+1);  // put the count for each character
    }
    for(Map.Entry<Character,Integer> entry:map.entrySet()){  // iterate the map again and append each character's occurence into stringbuilder
        sb.append(entry.getValue());
        sb.append(entry.getKey());
    }

    System.out.println("String = " + sb.toString()); // here you go, we got the final string
    return sb.toString();
}
...