Как я могу рассчитать количество конкретных символов в строке? - PullRequest
0 голосов
/ 23 октября 2011

Учитывая строку, как я могу выяснить, сколько раз каждый символ в строке повторяется например: aaaabbaaDD выход: 4a2b2a2D

public static void Calc() {

        Input();

        int count = 1;

        String compressed = "";

        for (int i = 0; i < input.length(); i++) {

            if (lastChar == input.charAt(i)) {

                count++;

                compressed += Integer.toString(count) + input.charAt(i);
            }

            else {

                lastChar = input.charAt(i);
                count = 1;
            }

        }

        System.out.println(compressed);

    }

Ответы [ 4 ]

1 голос
/ 23 октября 2011

Эта программа сначала находит уникальные символы или цифры в строке. Затем он проверит частоту возникновения. Эта программа рассматривает заглавные и маленькие буквы как разные символы. При необходимости вы можете изменить его, используя метод ignorecase.


import java.io.*;
public class RunLength {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException {
        System.out.println("Please enter the string");
        String str = br.readLine();//the input string is in str
        calculateFrequency(str);
    }
    private static void calculateFrequency(String str) {
        int length = str.length();
        String characters[] = new String[length];//to store all unique characters in string
        int frequency[] = new int[length];//to store the frequency of the characters
        for (int i = 0; i < length; i++) {
            characters[i] = null;
            frequency[i] = 0;
        }</p>

    //To get unique characters
    char temp;
    String temporary;
    int uniqueCount = 0;
    for (int i = 0; i < length; i++) {
        int flag = 0;
        temp = str.charAt(i);
        temporary = "" + temp;
        for (int j = 0; j < length; j++) {
            if (characters[j] != null && characters[j].equals(temporary)) {
                flag = 1;
                break;
            }
        }
        if (flag == 0) {
            characters[uniqueCount] = temporary;
            uniqueCount++;
        }
    }

    // To get the frequency of the characters
    for(int i=0;i<length;i++){
        temp=str.charAt(i);
        temporary = ""+temp;
        for(int j=0;i<characters.length;j++){
            if(characters[j].equals(temporary)){
                frequency[j]++;
                break;
            }
        }
    }

    // To display the output
    for (int i = 0; i < length; i++) {
        if (characters[i] != null) {
            System.out.println(characters[i]+" "+frequency[i]);
        }
    }
}}
1 голос
/ 23 октября 2011

То, что вы ищете, это "Кодировка длин серий".Вот рабочий код для этого:

 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 public class RunLengthEncoding {

public static String encode(String source) {
    StringBuffer dest = new StringBuffer();
   //  iterate through input string 
   // Iterate the string N no.of.times where N is size of the string to find run length for each character
    for (int i = 0; i < source.length(); i++) {
        // By default run Length for all character is one
        int runLength = 1;

        // Loop condition will break when it finds next character is different from previous character. 
        while (i+1 < source.length() && source.charAt(i) == source.charAt(i+1)) {
            runLength++;
            i++;
        }
        dest.append(runLength);
        dest.append(source.charAt(i));
    }
    return dest.toString();
}

public static String decode(String source) {
    StringBuffer dest = new StringBuffer();
    Pattern pattern = Pattern.compile("[0-9]+|[a-zA-Z]");
    Matcher matcher = pattern.matcher(source);
    while (matcher.find()) {
        int number = Integer.parseInt(matcher.group());
        matcher.find();
        while (number-- != 0) {
            dest.append(matcher.group());
        }
    }
    return dest.toString();
}

public static void main(String[] args) {
    String example = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW";
    System.out.println(encode(example));
    System.out.println(decode("1W1B1W1B1W1B1W1B1W1B1W1B1W1B"));
}
 }
0 голосов
/ 23 октября 2011

@ Решение Balarmurugan K лучше - но просто улучшив ваш код, я придумал это -

    String input = "aaaabbaaDD";
    int count = 0;
    char lastChar = 0;
    int inputSize = input.length();
    String output = "";
    for (int i = 0; i < inputSize; i++) {
        if (i == 0) {
            lastChar = input.charAt(i);
            count++;
        } else {
            if (lastChar == input.charAt(i)) {
                count++;
            } else {
                output = output + count + "" + lastChar;
                count = 1;
                lastChar = input.charAt(i);
            }
        }
    }
    output = output + count + "" + lastChar;
    System.out.println(output);
0 голосов
/ 23 октября 2011

Некоторые подсказки: в вашем примере кода вам также нужно сбросить count на 0, когда цикл завершится (при обновлении lastChar).И вам нужно вывести финальный прогон (после завершения цикла).И вам нужно что-то вроде else или continue между двумя делами.

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