Как подсчитать количество появлений символа в строке? - PullRequest
494 голосов
/ 09 ноября 2008

У меня есть строка

a.b.c.d

Я хочу посчитать вхождения '.' идиоматическим образом, предпочтительно однострочник.

(Ранее я выражал это ограничение как "без цикла", на случай, если вам интересно, почему все пытаются ответить без использования цикла).

Ответы [ 41 ]

4 голосов
/ 15 ноября 2012
import java.util.Scanner;

class apples {

    public static void main(String args[]) {    
        Scanner bucky = new Scanner(System.in);
        String hello = bucky.nextLine();
        int charCount = hello.length() - hello.replaceAll("e", "").length();
        System.out.println(charCount);
    }
}//      COUNTS NUMBER OF "e" CHAR´s within any string input
3 голосов
/ 09 ноября 2008

Хотя методы могут скрыть это, нет способа считать без цикла (или рекурсии). Вы хотите использовать символ [] из соображений производительности.

public static int count( final String s, final char c ) {
  final char[] chars = s.toCharArray();
  int count = 0;
  for(int i=0; i<chars.length; i++) {
    if (chars[i] == c) {
      count++;
    }
  }
  return count;
}

Использование replaceAll (то есть RE) не похоже на лучший путь.

3 голосов
/ 07 июня 2011
public static int countOccurrences(String container, String content){
    int lastIndex, currIndex = 0, occurrences = 0;
    while(true) {
        lastIndex = container.indexOf(content, currIndex);
        if(lastIndex == -1) {
            break;
        }
        currIndex = lastIndex + content.length();
        occurrences++;
    }
    return occurrences;
}
2 голосов
/ 28 апреля 2011

Почему бы просто не разделить символ и затем получить длину полученного массива. длина массива всегда будет равна числу экземпляров + 1. Верно?

2 голосов
/ 07 мая 2014
int count = (line.length() - line.replace("str", "").length())/"str".length();
2 голосов
/ 11 ноября 2008

Где-то в коде что-то должно зацикливаться. Единственным выходом из этого является полное развертывание цикла:

int numDots = 0;
if (s.charAt(0) == '.') {
    numDots++;
}

if (s.charAt(1) == '.') {
    numDots++;
}


if (s.charAt(2) == '.') {
    numDots++;
}

... и т. Д., Но тогда вы выполняете цикл вручную в редакторе исходного кода, а не на компьютере, на котором он будет запущен. Смотрите псевдокод:

create a project
position = 0
while (not end of string) {
    write check for character at position "position" (see above)
}
write code to output variable "numDots"
compile program
hand in homework
do not think of the loop that your "if"s may have been optimized and compiled to
2 голосов
/ 20 марта 2009

Вот рекурсивное решение немного другого стиля:

public static int countOccurrences(String haystack, char needle)
{
    return countOccurrences(haystack, needle, 0);
}

private static int countOccurrences(String haystack, char needle, int accumulator)
{
    if (haystack.length() == 0) return accumulator;
    return countOccurrences(haystack.substring(1), needle, haystack.charAt(0) == needle ? accumulator + 1 : accumulator);
}
2 голосов
/ 02 мая 2013

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

import java.util.Scanner;

public class CountingOccurences {

    public static void main(String[] args) {

        Scanner inp= new Scanner(System.in);
        String str;
        char ch;
        int count=0;

        System.out.println("Enter the string:");
        str=inp.nextLine();

        while(str.length()>0)
        {
            ch=str.charAt(0);
            int i=0;

            while(str.charAt(i)==ch)
            {
                count =count+i;
                i++;
            }

            str.substring(count);
            System.out.println(ch);
            System.out.println(count);
        }

    }
}
2 голосов
/ 15 января 2016

Ну, с довольно похожей задачей я наткнулся на эту тему. Я не видел никаких ограничений языка программирования, и поскольку groovy работает на Java vm: Вот как мне удалось решить мою проблему с помощью Groovy.

"a.b.c.".count(".")

сделано.

2 голосов
/ 23 июня 2017

Использование Коллекции Eclipse

int count = CharAdapter.adapt("a.b.c.d").count(c -> c == '.');

Если у вас есть более одного символа для подсчета, вы можете использовать CharBag следующим образом:

CharBag bag = CharAdapter.adapt("a.b.c.d").toBag();
int count = bag.occurrencesOf('.');

Примечание: я являюсь коммиттером для Eclipse Collections.

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