Как проверить, что все символы в строке одинаковые?
Допустим есть массив стрингов. Как проверить, что какие-то строки в нём состоят только из одинаковых символов? Например «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
Поиск одинаковых элементов в строке

Помогите, пожалуйста, с решением задачи.
Есть задача. Посчитать сколько раз в строке встречается каждый её элемент.
Я написал код, но строки №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
Сообщений: 2081 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
Сообщений: 2081 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; } } } } }