Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Как правильно можно узнать количество определенных символов в String/Integer'e?

#java


Коллеги, вопрос такой:
Как правильно можно узнать количество определенных символов в String/Integer'e?
Допустим есть строка 1110001101011 - мне нужно из нее узнать кол-во единиц или нулей,
как на Java это сделать? Стандартных методов нет...    


Ответы

Ответ 1



Наверное самый простой способ будет посимвольный разбор строки и сравнение каждого элемента отдельно, что-то вроде: String str = "1100011"; int countNulls=0, countOnes = 0; for (char element : str.toCharArray()){ if (element == '0') countNulls++; if (element == '1') countOnes++; }

Ответ 2



Регулярно не выражаться! import java.util.*; import java.lang.*; class Main { public static void main (String[] args) throws java.lang.Exception { String string = "1110001101011"; Map map = 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); } }

Ответ 3



Если эффективно, то цикл. Если штатно - то есть готовый метод - countMatches. Прям с демками. В общем случае лучше предпочитать готовые библиотечные функции, так как обычно они уже достаточно хорошо работают. И только если они не удовлетворяют по скорости/качеству (либо просто нет таких), тогда писать свой велосипед. Но если это учебное задание, то тогда нужно писать так, как хочет преподаватель, и не важно, эффективно или нет, так как для некоторых преподавателей важно, что бы они понимали решение. Но ещё я в условии заметил слово "Integer". Но в Integer'e нет символов (при желании их конечно можно найти там, например рассматривая Integer как 4 (или 2) char. Но это что то не то:)

Ответ 4



данное решение позволяет считать любые символы, у вас есть возможность самому задавать символы которые нужно посчитать. теоретически должно работать с приемлимой производительностью: public class CountCharacters { public static void main(String[] args) { // two usage examples for provided input string countCharacters("1110001101011", '0', '1'); countCharacters("1110001101011", new char[] {'0', '1'}); // 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'

Ответ 5



import java.util.regex.Matcher; import java.util.regex.Pattern; public class OneZero { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String s = "1011110011"; Pattern pattern = Pattern.compile("1"); Matcher matcher = pattern.matcher(s); int n = 0; while (matcher.find()) { System.out.println(matcher.group()); n++; } System.out.println("N = " + n); } } Выводит количество единиц в консоль 1 1 1 1 1 1 1 N = 7

Комментариев нет:

Отправить комментарий