Как найти подстроку в строке и получить ее счет с помощью Java - PullRequest
0 голосов
/ 09 ноября 2018

У меня возникла проблема, когда мне нужно найти подстроку в массиве символов и подсчитать, сколько раз эта подстрока встречалась. Например: "aabbcccddaabbbccc" O / P: аа: 2 ББ: 1 ссс: 2 дд: 1 БББ: 1

Я попробовал этот код, но он не дает мне правильного решения, если кто-то может подсказать мне, что я делаю неправильно

public class CountSubString {
     static Set set=new HashSet<>();
     static List list=new ArrayList<>();


    private static Map<char[], Integer> count(char[] charArrayToParse){
        Map<char[], Integer> subString = new HashMap<char[], Integer>();

        for (int i=0; i<charArrayToParse.length ;)
        {StringBuilder word= new StringBuilder();
            for (int j=i; j<charArrayToParse.length; j++) {

                if(charArrayToParse[i] == charArrayToParse[j]) {
                    word.append(charArrayToParse[j]);
                }
                else {
                    char[] subStringDone = word.toString().toCharArray();
                    if(subString.isEmpty())
                    subString.put(subStringDone, 1);

                    else if(subString.containsKey(subStringDone)) {
                        subString.put(subStringDone, subString.get(subStringDone)+1);
                    }
                    else {
                        subString.put(subStringDone, 1);
                    }

                //System.out.println("Word value are"+subString.get(key));
                    i=j;
                break;
                }

            }

        }
        Set<char[]> keyValues=  subString.keySet();
        for(char[] ch : keyValues) {
            if(subString.get(ch)>1) {
                 System.out.println(ch+"--->"+subString.get(ch));
            }
        }
        return subString;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str = "aaabbbccddddaaaeebbb"; 
        char[] charArray = str.toCharArray();
        Map<char[], Integer> parsedArray= new HashMap<char[], Integer>();
    parsedArray= count(charArray);
    }

}

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Что следует учитывать .. для bbaaarr есть две последовательности aa или только одна? Мое решение считает, что есть два, но это может быть легко приспособлено для другого случая.

Комментарии в моем коде, чтобы помочь объяснить это:


/**
 * Returns the number of times the sequence occurs in the string.
 * @param seq - the sequence you are looking for
 * @param str - the string you are searching in
 */
private static int count(String seq, String str) {
    if(seq == null || seq.isEmpty() ||
       str == null || str.isEmpty() ){
        return 0;
    }
    int count = 0;

    // the first character of the sequence you are looking for
    final char seqChar = seq.charAt(0);

    // if there aren't seq.length() chars remaining then
    // it's no longer possible to match your sequence
    // so this is the max index to go to when looking for it
    final int maxIndex = str.length() - seq.length();

    // iterate through the characters in your string
    for (int i = 0; i <= maxIndex; i++) {
        // when you find a character matching the start of your sequence
        // then compare the substring of equal length to your sequence
        // and if it matches then you have a match
        if (seqChar == str.charAt(i) &&
            seq.equals(str.substring(i, i + seq.length()))) {
            count++;
        }
    }
    return count;
}

public static void main(String[] args){
    String s = "aabbcccddaabbbccc";
    System.out.println(count("aa", s)); // 2
    // [aa]bbcccddaabbbccc
    // aabbcccdd[aa]bbbccc

    System.out.println(count("bb", s)); // 3
    // aa[bb]cccddaabbbccc
    // aabbcccddaa[bb]bccc
    // aabbcccddaab[bbccc

    System.out.println(count("cc", s)); // 4
    // aabb[cc]cddaabbbccc
    // aabbc[cc]ddaabbbccc
    // aabbcccddaabbb[cc]c
    // aabbcccddaabbbc[cc] 
}
0 голосов
/ 09 ноября 2018

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

Ваш двойной цикл for создает бесконечный цикл. Вы устанавливаете i = j, и оно недостаточно высоко, чтобы выйти из цикла (никогда не выходит за 17). В моей книге вложенные циклы обычно являются запахом кода, у вас есть кое-что, что должно быть разбито на несколько дополнительных функций (низкая сплоченность).

В этом случае вашей первой функцией должно быть разбиение строки на шаблоны. Ваши вложенные циклы for могут быть уменьшены до одного цикла, и каждый раз, когда шаблон найден, добавляйте его в Set<String> вместо карты. Это предотвратит дублирование, поскольку набор может содержать только уникальные значения.

Затем вы можете перейти к следующей части, которая должна определить количество ваших паттернов. Помните, что в этом случае перебирайте строку и проверяйте совпадения. Вам нужно будет принять во внимание, что aa также будет соответствовать aaa при подсчете.

0 голосов
/ 09 ноября 2018

Можете ли вы использовать библиотеки? Если так, то StringUtils в apache.commons.lang3 может решить проблему в одной строке, например:

int count = StringUtils.countMatches("aabbcccddaabbbccc", "aa");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...