Как посчитать одинаковые символы в строке java
Перейти к содержимому

Как посчитать одинаковые символы в строке java

  • автор:

Как проверить, что все символы в строке одинаковые?

Допустим есть массив стрингов. Как проверить, что какие-то строки в нём состоят только из одинаковых символов? Например «aaaa», «bbbbb»,»ccc»? Пример:

String[] texts = new String[50_000]; text[0] = "aaa"; text[1] = "abcc"; text[2] = "ccccc"; text[3] = "bbbb"; text[4] = "cca"; 

Отслеживать
26.3k 7 7 золотых знаков 32 32 серебряных знака 48 48 бронзовых знаков
задан 24 фев 2023 в 10:49
1 2 2 бронзовых знака
и даже вообще никаких своих идей нет?
24 фев 2023 в 10:57

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Для решения этой задачи можно написать функцию, которая будет проверять каждую строку на предмет того, состоит ли она только из одинаковых символов. Вот пример такой функции на языке Java:

public static boolean isSameCharacters(String s) < if (s == null || s.length() == 0) < return false; >char c = s.charAt(0); for (int i = 1; i < s.length(); i++) < if (s.charAt(i) != c) < return false; >> return true; > 

Эта функция принимает на вход строку s и проверяет, состоит ли она только из одинаковых символов. Если да, то функция возвращает true, иначе — false. Функция начинает проверку с первого символа строки s, сохраняет его в переменной c и сравнивает остальные символы с ним. Если какой-то символ отличается от c, то функция возвращает false. Если все символы одинаковые, то функция возвращает true.

Чтобы проверить все строки в массиве texts, можно пройтись по нему в цикле и вызвать функцию isSameCharacters() для каждой строки:

for (String s : texts) < if (isSameCharacters(s)) < System.out.println(s + " consists of same characters"); >> 

Этот код пройдется по всем строкам в массиве texts, вызовет функцию isSameCharacters() для каждой из них и напечатает те, которые состоят только из одинаковых символов.

Как посчитать количество букв в строке 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 из N повторяющихся символов

В этом уроке мы познакомимся с различными вариантами создания строки из N повторяющихся символов . Это удобно, когда нам нужно добавить отступы, создать ASCII-графику и т. д.

Эта проблема легко решается в JDK11, но если мы используем более раннюю версию, то доступно множество других решений. Мы начнем с наиболее распространенных и добавим другие подходы из некоторых библиотек.

2. Пример​

Давайте определим константы, которые мы будем использовать во всех решениях для проверки сгенерированной строки:

 private static final String EXPECTED_STRING = "aaaaaaa";   private static final int N = 7; 

Итак, константа EXPECTED_STRING представляет собой строку, которую нам нужно сгенерировать в решениях. Константа N используется для определения количества повторений символов.

Теперь давайте рассмотрим варианты генерации строки из N повторяющихся символов a .

3. Функция JDK11 String.repeat ​

В Java есть функция повтора для создания копий исходной строки:

 String newString = "a".repeat(N);   assertEquals(EXPECTED_STRING, newString); 

Это позволяет нам повторять отдельные символы или многосимвольные строки:

 String newString = "-->".repeat(5);   assertEquals("-->-->-->-->-->", newString); 

Алгоритм, стоящий за этим, использует циклы для достаточно эффективного заполнения массивов символов.

Если у нас нет JDK11, то нам придется создавать алгоритм самостоятельно или использовать его из сторонней библиотеки. Лучшие из этих ИС вряд ли будут намного быстрее или проще в использовании, чем собственное решение JDK11.

4. Распространенные способы построения строки ​

4.1. StringBuilder с циклом for ​

Начнем с класса StringBuilder . Мы будем повторять цикл for N раз, добавляя повторяющийся символ:

 StringBuilder builder = new StringBuilder(N);   for (int i = 0; i  N; i++)    builder.append("a");   >   String newString = builder.toString();   assertEquals(EXPECTED_STRING, newString); 

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

4.2. char Массив с циклом for ​

Мы можем заполнить массив символов фиксированного размера желаемым символом и преобразовать его в строку:

 char[] charArray = new char[N];   for (int i = 0; i  N; i++)    charArray[i] = 'a';   >   String newString = new String(charArray);   assertEquals(EXPECTED_STRING, newString); 

Это должно быть быстрее, поскольку не требует структуры с динамическим размером для хранения нашей строки по мере ее создания , а Java может эффективно преобразовывать массив символов в строку.

4.3. Метод заполнения массивов ​

Вместо использования цикла мы можем использовать библиотечную функцию для заполнения нашего массива:

 char charToAppend = 'a';   char[] charArray = new char[N];   Arrays.fill(charArray, charToAppend);   String newString = new String(charArray);   assertEquals(EXPECTED_STRING, newString); 

Это короче и так же эффективно во время выполнения, как и предыдущее решение.

5. Генерация строки с помощью метода повтора ​

5.1. Метод повторения Apache​

Это решение требует добавления новой зависимости для библиотеки Apache Commons :

 dependency>   groupId>org.apache.commonsgroupId>   artifactId>commons-lang3artifactId>   version>3.12.0version>   dependency> 

После добавления этой зависимости мы можем использовать метод repeat из класса StringUtils . Он принимает в качестве параметров символ для повторения и количество повторений символа :

 char charToAppend = 'a';   String newString = StringUtils.repeat(charToAppend, N);   assertEquals(EXPECTED_STRING, newString); 

5.2. Метод повторения гуавы​

Как и в предыдущем подходе, для этого требуется новая зависимость для библиотеки Guava :

 dependency>   groupId>com.google.guavagroupId>   artifactId>guavaartifactId>   version>31.0.1-jreversion>   dependency> 

Помимо того факта, что оно взято из другой библиотеки, это решение идентично решению Apache Commons:

 String charToAppend = "a";   String newString = Strings.repeat(charToAppend, N);   assertEquals(EXPECTED_STRING, newString); 

6. Генерация строки с помощью метода nCopies ​

Если мы представим нашу целевую строку как набор повторяющихся подстрок, то мы могли бы использовать утилиту List для создания списка, а затем преобразовать полученный список в нашу окончательную строку String . Для этого мы можем использовать метод nCopies из класса Collections в пакете java.util :

 public static T> ListT> nCopies(int n, T o); 

Хотя построение списка подстрок менее эффективно, чем наши решения, использующие фиксированный массив символов, может быть полезно повторить шаблон символов, а не только один символ.

6.1. Соединение строк и методы nCopies ​

Давайте создадим список односимвольных строк с помощью метода nCopies и воспользуемся String.join для преобразования его в наш результат:

 String charToAppend = "a"; String newString = String.join("", Collections.nCopies(N, charToAppend)); assertEquals(EXPECTED_STRING, newString); 

Методу String.join нужен разделитель, для которого мы используем пустую строку.

6.2. Guava Joiner и метод nCopies ​

Guava предлагает альтернативный соединитель строк, который мы также можем использовать:

 String charToAppend = "a";   String newString = Joiner.on("").join(Collections.nCopies(N, charToAppend));   assertEquals(EXPECTED_STRING, newString); 

7. Генерация строки с помощью метода Stream generate ​

Недостатком создания списка подстрок является то, что мы создаем потенциально большой объект временного списка до того, как создадим окончательную строку.

Однако, начиная с Java 8, мы можем использовать метод generate из Stream API . В сочетании с методом limit (для определения длины) и методом collect мы можем сгенерировать строку из N повторяющихся символов :

 String charToAppend = "a";   String newString = generate(() -> charToAppend)   .limit(length)   .collect(Collectors.joining());   assertEquals(exampleString, newString); 

8. Генерация строки с помощью Apache RandomStringUtils ​

Класс RandomStringUtils из библиотеки Apache Commons позволяет генерировать строку из N повторяющихся символов с использованием случайного метода . Мы должны определить символ и количество повторений:

 String charToAppend = "a";   String newString = RandomStringUtils.random(N, charToAppend);   assertEquals(EXPECTED_STRING, newString); 

9. Заключение​

В этой статье мы видели различные решения для генерации строки из N повторяющихся символов. Самый простой из них — String.repeat , доступный начиная с JDK 11.

Для более ранних версий Java существует множество других возможных доступных опций. Лучший выбор будет зависеть от наших требований с точки зрения эффективности времени выполнения, простоты кодирования и доступности библиотек.

Как всегда, код этих примеров доступен на GitHub .

  • 1. Обзор
  • 2. Пример
  • 3. Функция JDK11 String.repeat
  • 4. Распространенные способы построения строки
    • 4.1. StringBuilder с циклом for
    • 4.2. char Массив с циклом for
    • 4.3. Метод заполнения массивов
    • 5.1. Метод повторения Apache
    • 5.2. Метод повторения гуавы
    • 6.1. Соединение строк и методы nCopies
    • 6.2. Guava Joiner и метод nCopies

    Поиск одинаковых элементов в строке

    Author24 — интернет-сервис помощи студентам

    Помогите, пожалуйста, с решением задачи.
    Есть задача. Посчитать сколько раз в строке встречается каждый её элемент.
    Я написал код, но строки №28 и №29 работают не так, как надо. В них не происходит присвоение элементов.
    Если кто знает, в чем дело, подскажите, пожалуйста!

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
    package myhello; import java.util.*; class Series { public static void main(String args[]) { String s1; String s2[]= new String[1000]; int i,j,k=0; int A[]= new int[1000]; String C[] = new String[1000]; Scanner src = new Scanner(System.in); System.out.println("Введите строку: "); s1=src.nextLine(); s2=s1.split(""); for(i=0; is1.length(); i++) { for(j=0; js1.length(); j++) { if( s2[i].equals(C[j])) {A[j]++; break;} } if ( j==s1.length()) { C[k]=s2[i]; A[k]++; k++; }} for (i=0; ik; i++) { System.out.println(C[k]+" "+A[k]); } src.close();} }

    Лучшие ответы ( 1 )
    94731 / 64177 / 26122
    Регистрация: 12.04.2006
    Сообщений: 116,782
    Ответы с готовыми решениями:

    Поиск одинаковых символов в строке
    Доброго времени суток, вопрос в следующем : Если в строке есть одинаковые символы, то нужно.

    Поиск соседних одинаковых элементов
    Доброго времени суток! Есть такая задачка: существует массив 8х8, вводятся i,j индексы и если эти.

    Бинарный поиск одинаковых элементов в массиве
    Нужно создать бинарный поиск в массиве из чисел. Но никак не могу понять, как найти все позиции.

    Поиск одинаковых слов. Поиск адреса в БД
    Добрый день! Ребята подскажите пожалуйста, задача написать сервер принимающий POST запрос (в нем 2.

    89 / 89 / 20
    Регистрация: 19.02.2010
    Сообщений: 966

    ЦитатаСообщение от vladimir_Ronny Посмотреть сообщение

    if( s2[i].equals(C[j])) {A[j]++; break;}

    У Вас же C[j] всегда нулл же

    Добавлено через 10 минут
    но нет вот как бы что получаю когда пишу внутри фора System.out.println(s2[i]+» —- «+C[j]);

    Кликните здесь для просмотра всего текста
    Регистрация: 13.06.2015
    Сообщений: 78

    ЦитатаСообщение от asus Посмотреть сообщение

    У Вас же C[j] всегда нулл же
    Добавлено через 10 минут
    но нет вот как бы что получаю когда пишу внутри фора System.out.println(s2[i]+» —- «+C[j]);

    В этом месте программа отрабатывает правильно. Но в строках №28 и №29 почему-то не происходит копирование.

    Mobile Software Engineer

    Эксперт С++

    5381 / 1585 / 956
    Регистрация: 23.01.2011
    Сообщений: 3,214

    ЦитатаСообщение от vladimir_Ronny Посмотреть сообщение

    Посчитать сколько раз в строке встречается каждый её элемент

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    package ua.ev_g_en.cyberforum; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.Set; import java.util.stream.Stream; public class Main { private static String sInputString; private static BufferedReader sInputReader; public static void main(String[] args) throws IOException { sInputReader = new BufferedReader(new InputStreamReader(System.in)); sInputString = sInputReader.readLine(); sInputReader.close(); Set Character> uniqueCharacters = new HashSet <> (); for (char currentCharacter : sInputString.toCharArray()) { uniqueCharacters.add(currentCharacter); } uniqueCharacters.forEach(currentCharacter -> { System.out.print("\'" + currentCharacter + "\' - "); System.out.println(sInputString.chars() .mapToObj(intCharacter -> (char) intCharacter) .filter(character -> character.equals(currentCharacter)) .count()); }); } }

    34 / 34 / 35
    Регистрация: 21.04.2015
    Сообщений: 74

    Лучший ответ

    Сообщение было отмечено vladimir_Ronny как решение

    Решение

    Так и не понял что вы хотели сделать этим кодом.
    Данную задачу я бы решал так:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
    public class Temp { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Введите строку:"); char[] arr = sc.nextLine().toCharArray(); MapCharacter, Integer> map = new HashMap<>(); for(int i = 0; i  arr.length; i++) { char c = arr[i]; int count = 0; for(int j = 0; j  arr.length; j++) { if(c == arr[j]) { count++; } } map.put(c, count); } System.out.println(map.toString()); } }

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

    95 / 95 / 50
    Регистрация: 07.07.2015
    Сообщений: 208

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
    import java.util.HashMap; import java.util.Map; import java.util.Scanner; /** * Посчитать сколько раз в строке * встречается каждый её элемент. */ public class MapSample { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); MapCharacter,Integer> map = new HashMap<>(); String input; int value = 1; while (true){ System.out.print("Введите строку(enter для выхода): "); input = scanner.nextLine(); if (input.length() == 0) break; char[] array = new char[input.length()]; array = input.trim().toLowerCase().toCharArray(); for (int i = 0; i  array.length; i++) { if (Character.isWhitespace(array[i])){ continue; }else { if (map.containsKey(array[i])){ value = map.get(array[i]); map.replace(array[i], ++value); }else{ map.put(array[i], 1); } } } for (Map.EntryCharacter,Integer> pair : map.entrySet()){ System.out.printf("Символ '%s' встречается %d раз\n", pair.getKey(), pair.getValue()); } } } }

    Регистрация: 13.06.2015
    Сообщений: 78

    ЦитатаСообщение от rory-breaker Посмотреть сообщение

    Так и не понял что вы хотели сделать этим кодом.

    Спасибо большое за решение — просто и доступно.
    Мое решение подразумевало такую же идею как и у вас. Создать два массива — один для символов, второй — счетчик соответствующего символа. А потом

    1 2 3 4 5 6 7 8 9 10 11 12 13
    for(i=0; is1.length(); i++) { for(j=0; js1.length(); j++) { if( s2[i].equals(C[j])) //проверить, был ли уже этот элемент ранее посчитан? {A[j]++; break;} //если два, увеличить его счетчик } if ( j==s1.length()) //если нет, то. { C[k]=s2[i]; //. внести его в массив A[k]++; // и задать ему значение 1 k++; }}

    95 / 95 / 50
    Регистрация: 07.07.2015
    Сообщений: 208

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
    import java.util.HashMap; import java.util.Map; import java.util.Scanner; /** * Посчитать сколько раз в строке * встречается каждый её элемент. */ public class MapSample { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); MapCharacter,Integer> map = new HashMap<>(); String input; int value; while (true) { System.out.print("Введите строку(enter для выхода): "); input = scanner.nextLine(); if (input.length() == 0) break; char[] array = input.trim().toLowerCase().toCharArray(); for (int i = 0; i  array.length; i++) { if (Character.isWhitespace(array[i])){ continue; }else { if (map.containsKey(array[i])){ value = map.get(array[i]); map.replace(array[i], ++value); }else{ map.put(array[i], 1); } } } for (Map.EntryCharacter,Integer> pair : map.entrySet()){ System.out.printf("Символ '%s' встречается %d раз\n", pair.getKey(), pair.getValue()); } while (true){ System.out.println("Сбросить таблицу? (y/n)"); input = scanner.nextLine(); if(input.equals("y")){ map.clear(); break; }else if (input.equals("n")){ break; } } } } }

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *