проверить номер вхождения данного символа в строку - PullRequest
0 голосов
/ 29 января 2012

Я хочу написать простой класс для обработки строк (в нем могут быть очень длинные строки длиной до 1 миллиона символов).Строка будет в основном состоит из двух символов «a» и «b», которые могут смешиваться друг с другом.Если число a равно числу b, то приложение скажет, что все в порядке, иначе NOK.Интересно, как сделать это наиболее эффективно.Я думал об использовании регулярных выражений для разделения String, а затем подсчитывал случаи появления a и b, но, возможно, кто-то знает лучший способ сделать это.Я относительно новичок в регулярных выражениях, поэтому, пожалуйста, дайте мне знать, если будут какие-либо ошибки.Это моя ранняя попытка.

public class Typo { 
    public static void main(String[] args){     
        String ver = "";
        int na = 0;
        int nb = 0;
        String regex = ("\\w.+");
        Pattern p = Pattern.compile(regex);
        String text = "ababababbaba";
        if (text.length() == 0){
            ver = "OK";
        }
        else if (text.length() == 1){
            ver = "NOK";
        }
        else if ((text.length() % 2) == 1){
            ver = "NOK";
        }
        else if ((text.length() % 2) == 0){
            //check number of a and b and if it equals return OK otherwise NOK
            Matcher m1 = p.matcher("a");
            while(m1.find()){
                na = na + 1;
            }
            Matcher m2 = p.matcher("b");
            while(m2.find()){
                nb = nb + 1;
            }
            if (na == nb){
                ver = "OK";
            }
            else 
                ver = "NOK";
        }
        System.out.println(ver);
    }

}

Ответы [ 6 ]

3 голосов
/ 29 января 2012

Зачем вам нужно регулярное выражение и разбить строку для этого! Вы можете просто перебрать строку и посчитать количество a и bs. Вы должны держать два разных счетчика, один для а и один для б. Использование регулярного выражения будет менее эффективным. Невозможно получить результат, не пройдя строку хотя бы один раз. Поэтому используйте простой цикл для подсчета a и b.

  • Вы можете сделать одну оптимизацию в цикле. Если в любое время мод countA - countB больше, чем количество оставшихся символов, то a и b никогда не могут быть равны. Таким образом, вы можете разорвать петлю тогда.

  • Если длина строки нечетная, то нет необходимости считать. Количество a и b никогда не может быть равным, если общее количество элементов нечетное.

1 голос
/ 30 января 2012
public class Typo { 
    public static void main(String[] args){     
        String ver = "NOK";

        String text = "ababababbaba";

        if( (text.length() - text.replaceAll("a","").length() ) ==  
            ( text.length() - text.replaceAll("b","").length() ) ) {
            ver = "OK";     
        }

        System.out.println(ver);
    }
}
1 голос
/ 29 января 2012

Что не так с использованием чего-то простого, как это? Ваша идея сделать что-то настолько простое, как это, является излишним, и в конечном итоге вы будете использовать больше ресурсов.

String s = "abbb";

int a = 0;
int b = 0;
for(int i = 0; i<s.length(); i++){
    if((s.charAt(i) == 'a')){
        a += 1;
    } else {
        b += 1;
    }
}

a = 1; b = 3

1 голос
/ 29 января 2012

Если вы хотите, вы можете использовать стороннюю библиотеку, такую ​​как StringUtils .У него есть метод countMatches , который будет выполнять эту работу.

StringUtils.countMatches("abba", "a")   = 2
StringUtils.countMatches("abba", "ab")  = 1
1 голос
/ 29 января 2012

Я считаю, что это то, что вы хотите:

private static boolean check(String input) {
    int count = 0;
    for (int i = 0; i < input.length(); ++i) {
        if (input.charAt(i) == 'a') {
            count++;
        }
    }
    return count == input.length() >> 1; // count == input.length()/2
}
1 голос
/ 29 января 2012

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

Для этой задачи будет достаточно простого счетчика: увеличение на a, уменьшение на b, проверка на ноль в конце, чтобы узнать ответ на вашу проблему.

boolean check(String s) {
    int count = 0;
    for (int i = 0 ; i != s.length() ; i++) {
        if (s.charAt(i) == 'a') {
            count++;
        } else { /* it is b */
            count--;
        }
    }
    return count == 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...