milten15 / Подсчёт количество букв в строке[charAt(i)].java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| import java . io . BufferedReader ; |
| import java . io . InputStreamReader ; |
| import java . util . ArrayList ; |
| /* Количество букв |
| Ввести с клавиатуры 10 строчек и подсчитать в них количество различных букв (для 33 букв алфавита). Вывести результат на экран. |
| Пример вывода: |
| а 5 |
| б 8 |
| в 3 |
| г 7 |
| д 0 |
| … |
| я 9 |
| */ |
| public class Solution |
| public static void main ( String [] args ) throws Exception |
| BufferedReader reader = new BufferedReader ( new InputStreamReader ( System . in )); |
| //алфавит |
| String abc = «абвгдеёжзийклмнопрстуфхцчшщъыьэюя» ; |
| char [] abcArray = abc . toCharArray (); |
| ArrayList < Character >alphabet = new ArrayList < Character >(); |
| for ( int i = 0 ; i < abcArray . length ; i ++) |
| alphabet . add ( abcArray [ i ]); |
| > |
| //ввод строк |
| ArrayList < String >list = new ArrayList < String >(); |
| for ( int i = 0 ; i < 10 ; i ++) |
| String s = reader . readLine (); |
| list . add ( s . toLowerCase ()); |
| > |
| //напишите тут ваш код |
| for ( Character character : alphabet ) |
| int count = 0 ; |
| for ( String s : list ) |
| for ( int i = 0 ; i < s . length (); i ++) |
| if ( s . charAt ( i ) == character ) |
| count ++; |
| > |
| > |
| > |
| System . out . println ( character + » » + count ); |
| > |
| > |
| > |
Как посчитать количество букв в строке java
Чтобы посчитать количество букв в строке, можно использовать метод строк length() . Этот метод вернет длину строки:
var word = "Hello"; var lettersCount = word.length(); System.out.println(lettersCount); // 5
18 ноября 2022
Если строка содержит не только буквы, но и другие символы, а посчитать надо буквы, то можно так :
String word = "a1B2c!D%"; int lettersCount = 0; for (int i = 0; i word.length(); i++) if (Character.isAlphabetic(word.charAt(i))) lettersCount++; > > System.out.println(lettersCount); // => 4
Подсчет количества вхождений символа в строке
Есть много способов подсчитать количество вхождений символов в строку в Java.
В этом кратком руководстве сосредоточимся на нескольких примерах подсчета символов – сначала с помощью основной библиотеки Java, а затем с другими библиотеками и платформами, такими как Spring и Guava.
Использование библиотеки Java Core
Императивный подход
Некоторые разработчики предпочитают использовать Java Core. Существует множество способов подсчета количества вхождений символа в строку. Начнем с простого подхода:
String someString = "elephant"; char someChar = 'e'; int count = 0; for (int i = 0; i < someString.length(); i++) < if (someString.charAt(i) == someChar) < count++; >> assertEquals(2, count);
Неудивительно, что данный вариант сработает, но есть и лучшие способы.
Использование рекурсии
Менее очевидное, но все же интересное решение – использовать рекурсию:
private static int countOccurences( String someString, char searchedChar, int index) < if (index >= someString.length()) < return 0; >int count = someString.charAt(index) == searchedChar ? 1 : 0; return count + countOccurences( someString, searchedChar, index + 1); >
Можно вызвать этот рекурсивный метод следующим образом: useRecursionToCountChars(“elephant”, ‘e’, 0).
Использование регулярных выражений
Другой способ – использовать регулярные выражения:
Pattern pattern = Pattern.compile("[^e]*e"); Matcher matcher = pattern.matcher("elephant"); int count = 0; while (matcher.find()) < count++; >assertEquals(2, count);
Обратите внимание, что это решение технически правильное, но неоптимальное, так как использование очень мощных регулярных выражений для решения такой простой задачи, как определение количества вхождений символа в строку, является излишним.
Использование функций Java 8
Здесь могут оказаться очень полезными новые функции, доступные в Java 8.
Давайте используем stream и лямбда-выражения для реализации подсчета:
String someString = "elephant"; long count = someString.chars().filter(ch -> ch == 'e').count(); assertEquals(2, count); long count2 = someString.codePoints().filter(ch -> ch == 'e').count(); assertEquals(2, count2);
Таким образом, это явно более чистое и читабельное решение, использующее основную библиотеку.
Использование внешних библиотек
Рассмотрим несколько решений, использующих утилиты из внешних библиотек.
Использование StringUtils
Всегда лучше использовать существующее решение, чем изобретать свое. Класс commons.lang.StringUtils предоставляет метод countMatches(), который можно использовать для подсчета символов или даже подстрок в заданной строке.
Во-первых, необходимо подключить соответствующую зависимость:
org.apache.commons commons-lang3 3.12.0
Можно найти последнюю версию на Maven Central.
Теперь воспользуемся countMatches() для подсчета количества символов e в строковом литерале:
int count = StringUtils.countMatches("elephant", "e"); assertEquals(2, count);
Использование Guava
Guava может быть полезна при подсчете символов. Необходимо определить зависимость:
com.google.guava guava 31.0.1-jre
Можно найти последнюю версию на Maven Central.
Посмотрим, как Guava может быстро помочь подсчитать символы:
int count = CharMatcher.is('e').countIn("elephant"); assertEquals(2, count);
3.3. Использование Spring
Добавление Spring Framework в проект только для подсчета символов не имеет смысла.
Однако, если он уже есть в проекте, необходимо использовать метод countOccurencesOf():
int count = StringUtils.countOccurrencesOf("elephant", "e"); assertEquals(2, count);
Заключение
В этой статье мы сосредоточились на различных способах подсчета символов в строке. Некоторые из них были разработаны исключительно на Java; некоторые требовали дополнительных библиотек.
Рекомендуется использовать уже существующие утилиты от StringUtils, Guava или Spring. Тем не менее, эта статья предлагает некоторые возможности сделать это с помощью Java 8, если предпочтительнее использовать только Java.
Полный исходный код этих примеров доступен на GitHub.
Как правильно можно узнать количество определенных символов в String/Integer’e?
Коллеги, вопрос такой: Как правильно можно узнать количество определенных символов в String/Integer’e? Допустим есть строка 1110001101011 — мне нужно из нее узнать кол-во единиц или нулей, как на Java это сделать? Стандартных методов нет.
Отслеживать
задан 15 мая 2012 в 11:15
Павел Шестаков Павел Шестаков
135 1 1 золотой знак 4 4 серебряных знака 15 15 бронзовых знаков
Пройтись циклом, посчитать нули и единицы. В чем вопрос?
15 мая 2012 в 11:18
Просто удивительно, какой резонанс вызвала простейшая и похоже оторванная от реальной жизни задача.
16 мая 2012 в 8:25
Жду в ответах фабрику фабрик счетчиков символов )
17 мая 2012 в 7:22
Не накаркайте. А то можете получить фабрику фабрик счётчиков счётчиков символов.
17 мая 2012 в 9:09
5 ответов 5
Сортировка: Сброс на вариант по умолчанию
Наверное самый простой способ будет посимвольный разбор строки и сравнение каждого элемента отдельно, что-то вроде:
String str = "1100011"; int countNulls=0, countOnes = 0; for (char element : str.toCharArray())
Отслеживать
34.4k 15 15 золотых знаков 65 65 серебряных знаков 94 94 бронзовых знака
ответ дан 15 мая 2012 в 11:29
1,675 1 1 золотой знак 10 10 серебряных знаков 15 15 бронзовых знаков
Ну для 0 и 1 можно: int cnt[] = <0, 0>; for (char element: str.toCharArray()) cnt[element — ‘0’]++;0,>
15 мая 2012 в 12:27
Далее только оптимизация) String str = «1100011»; int countNulls = 0 for (char element : str.toCharArray()) < if (element == '0') < countNulls++; >> int countOnes = str.length() — countNulls;
15 мая 2012 в 20:29
import java.util.*; import java.lang.*; class Main < public static void main (String[] args) throws java.lang.Exception < String string = "1110001101011"; Mapmap = new HashMap(); for ( int i = 0; i < string.length(); i++ ) < Integer n = map.get( string.charAt(i) ); if ( n == null ) map.put( string.charAt(i), 1 ); else map.put( string.charAt(i), ++n ); >System.out.println(map); > >
Отслеживать
ответ дан 16 мая 2012 в 5:47
2,449 1 1 золотой знак 15 15 серебряных знаков 15 15 бронзовых знаков
Если в строке только 0 и 1, то проверка в цикле выглядит некрасиво. Лучше сразу занести пары («0», 0) и («1», 0).
16 мая 2012 в 6:12
Согласен для частного случая, однако у меня общее решение и покормить придется всем basic multilingual plane, что совсем некошерно. Уж проще тогда сделать сахарный класс, который будет принимать null за 0.
16 мая 2012 в 6:46
Если эффективно, то цикл. Если штатно — то есть готовый метод — countMatches. Прям с демками. В общем случае лучше предпочитать готовые библиотечные функции, так как обычно они уже достаточно хорошо работают. И только если они не удовлетворяют по скорости/качеству (либо просто нет таких), тогда писать свой велосипед.
Но если это учебное задание, то тогда нужно писать так, как хочет преподаватель, и не важно, эффективно или нет, так как для некоторых преподавателей важно, что бы они понимали решение.
Но ещё я в условии заметил слово «Integer». Но в Integer’e нет символов (при желании их конечно можно найти там, например рассматривая Integer как 4 (или 2) char. Но это что то не то:)
Отслеживать
ответ дан 16 мая 2012 в 19:26
112k 6 6 золотых знаков 93 93 серебряных знака 159 159 бронзовых знаков
У меня есть подозрение, что задача состоит в нахождении количества бит целого, равных 1. Просто автор не знает, что всего в Integer 32 бита.
16 мая 2012 в 20:43
Насчет штатного не совсем правда, это Apache Commons.
16 мая 2012 в 21:15
Apache Commons — это как boost для с++. Большая подборка хороших велосипедов.
17 мая 2012 в 6:41
данное решение позволяет считать любые символы, у вас есть возможность самому задавать символы которые нужно посчитать. теоретически должно работать с приемлимой производительностью:
public class CountCharacters < public static void main(String[] args) < // two usage examples for provided input string countCharacters("1110001101011", '0', '1'); countCharacters("1110001101011", new char[] ); // usage example for custom string countCharacters("00112233445566778800qwertyuiop[]<>asdfghjkl;'zxcvbnm,./", '0', '1', 'a', 'b', 'c'); > private static void countCharacters(String inputString, char. interestedCharacters) < final int[] occurences = new int[256]; final char[] array = inputString.toCharArray(); for (final char c : array) < occurences[c] = occurences[c] + 1; >// dump results for characters you are interested in for (int i = 0; i < interestedCharacters.length; i++) < System.out.println("found '" + occurences[interestedCharacters[i]] + "' occurences for character '" + interestedCharacters[i] + "'"); >System.out.println(); > >
выводит в консоль:
found '5' occurences for character '0' found '8' occurences for character '1' found '5' occurences for character '0' found '8' occurences for character '1' found '4' occurences for character '0' found '2' occurences for character '1' found '1' occurences for character 'a' found '1' occurences for character 'b' found '1' occurences for character 'c'
p.s. минусы, — неоптимальное использование памяти + нет поддержки кодировок. в принцыпе последнее можно легко исправить
аналогичным образом работает решение для int’ов:
private static int[] ALL_DIGITS = new int[] < 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 >; protected static void countNumbers(int i) < countNumbers(i, ALL_DIGITS); >protected static void countNumbers(int value, int. digits) < // number consists of only 10 digits int[] occurences = new int[10]; // copy value int x = value; while (x >= 10) < int low = x % 10; occurences[low] = occurences[low] + 1; x = (x - low) / 10; >occurences[x] = occurences[x] + 1; // dump results for digits you are interested in for (int i = 0; i < digits.length; i++) < System.out.println("found '" + occurences[digits[i]] + "' occurences for digit '" + digits[i] + "'"); >System.out.println(); >
countNumbers(111000110, 0, 1); countNumbers(1234567890);
found '4' occurences for digit '0' found '5' occurences for digit '1' found '1' occurences for digit '0' found '1' occurences for digit '1' found '1' occurences for digit '2' found '1' occurences for digit '3' found '1' occurences for digit '4' found '1' occurences for digit '5' found '1' occurences for digit '6' found '1' occurences for digit '7' found '1' occurences for digit '8' found '1' occurences for digit '9'
