Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Заблокирован

Частота повторений для всех символов в тексте

01.01.2020, 10:14. Показов 2845. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть текст, допустим: фывфыв ывфваавв ( на практике тут будет 200 символов ).
Мне нужно вывести в алфавитном порядке количество каждого символа
Каким примерно алгоритмом это можна сделать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.01.2020, 10:14
Ответы с готовыми решениями:

Частота повторений для всех символов в тексте
У меня есть текст, допустим: фывфыв ывфваавв ( на практике тут будет 200 символов ). Мне нужно вывести в алфавитном порядке количество...

Частота встречаемости символов в тексте
Привет. Помогите, пожалуйста. Нужно, чтобы программа брала текст из txt файла и подсчитывала количество русских и английских букв в...

Подсчет количества всех символов в тексте
На сайте не нашел ничего подобного. Помогите плиз. Нужно написать программу, чтобы она считала количество всех символов в файле. Т.е. не...

18
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
01.01.2020, 12:11
Каждый символ — это, по сути, число. Число можно использовать в качестве индекса для массива. Создаёшь массив размером с максимальный символ (буква 'я') и начинаешь обходить текст. Если встречаешь символ, то увеличиваешь счётчик по данному индексу (array[*символ*]++;). Под спойлером достаточно простой вариант решения
Кликните здесь для просмотра всего текста
Java
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
import java.util.Random;
 
public class Test {
    public static void main(String[] args) {
        String line = generateLine();
        int[] letters = new int['я' + 1];
        
        char c;
        for (int i = 0; i < line.length(); i++) {
            c = line.charAt(i);
            
            if (Character.isLetter(c)) {
                letters[c]++;
            }
        }
        
        for (int i = 0; i < letters.length; i++) {
            if (letters[i] != 0) {
                System.out.println((char) i + ": " + letters[i]);
            }
        }
    }
    
    private static String generateLine() {
        StringBuilder sb = new StringBuilder();
        Random rand = new Random(System.currentTimeMillis());
        
        int letter;
        for (int i = 0; i < 200; i++) {
            if (rand.nextInt() % 2 == 0) {
                letter = rand.nextInt(26) + (rand.nextInt() % 3 == 0 ? 'A' : 'a');
            } else {
                letter = rand.nextInt(32) + (rand.nextInt() % 3 != 0 ? 'А' : 'а');
            }
            
            sb.append((char) letter);
        }
        
        return sb.toString();
    }
}
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
01.01.2020, 16:56
Gungala, int[] letters = new int['я' + 1]; я не тестил, но неверное так
int[] letters = new int['я'- 'а' + 1];

Не по теме:

П.С. не то чтобы я тебя учил, тут люди прям пластами копипастят)



Добавлено через 2 минуты
Точно, есть же еще большие, надо значит на 2 еще.
0
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
01.01.2020, 17:18
Цитата Сообщение от ViktorFX Посмотреть сообщение
неверное так
у Gungala, все хорошо, ваш второй вариант не желателен, ибо требует дополнительных расчетов в параметрах и + к времени выполнения.

Цитата Сообщение от ViktorFX Посмотреть сообщение
еще большие
легким движением руки подставляются маленькие буквы

Добавлено через 1 минуту
Цитата Сообщение от Gungala Посмотреть сообщение
for (int i = 0; i < letters.length; i++) {
здесь правильнее было бы
Java
1
for (int i = 'а'; i < 'я' + 1; i++) {
Добавлено через 1 минуту
Цитата Сообщение от Gungala Посмотреть сообщение
if (Character.isLetter(c)) {
лишнее условие, прохождение будет все равно только по алфавиту
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
01.01.2020, 17:18
Java
1
2
3
4
Arrays.stream(generateLine().split(""))
                .sorted()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                .forEach((key, value) -> System.out.println(key + ": " + value));
1
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
01.01.2020, 17:28
Цитата Сообщение от sdasdaw Посмотреть сообщение
второй вариант не желателен, ибо требует дополнительных расчетов в параметрах и + к времени выполнения.
Ну не знаю letters.length дает 1104 что тоже на память и время влияет ))
0
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
01.01.2020, 17:33
ViktorFX, 4,5 килобайта - это память?
0
01.01.2020, 17:38

Не по теме:

sdasdaw, ну так и операции 'я'-'a' + 1, или 2*('я'-'a') + 1 тоже не слижком много занимают времени вычисления ))

0
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
01.01.2020, 17:43
ViktorFX, операции сложения / вычитания - знаимают больше времени умножения, а прямое обращение к индексу - o(1)
вы похоже не учитываете на перед, что каждый символ вам придется обрабатывать:
Java
1
arr[myChar - 'a']++;
Java
1
2*('я'-'a') + 1
здесь будет еще труднее логика для обработки, чтобы правильно расположить большие / маленькие буквы, чем сразу распологать готовой картой
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
01.01.2020, 17:45
Парни, а чего вы к буквам прицепились? В ТЗ все символы...

С Новым Годом!
3
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
01.01.2020, 18:09
Цитата Сообщение от sdasdaw Посмотреть сообщение
операции сложения / вычитания - знаимают больше времени умножения,
спасибо, я этого просто не знал.
Цитата Сообщение от sdasdaw Посмотреть сообщение
а прямое обращение к индексу - o(1)
вы похоже не учитываете на перед, что каждый символ вам придется обрабатывать:
о, а это именно суть. В изначальном коде Gungala, обращение происходило к каждому из элементов, и мое предложения было не в оптимизации а логике где letters содержит алфавит и ничего лишнего. А вот с этим for (int i = 'а'; i < 'я' + 1; i++) мне стало сейчас понятно (я это раньше не учитывал), хорошее решение!

Добавлено через 9 минут
iSmokeJC, Присоединяюсь, С Новым Годом Всех!!!

Не по теме:

П.С. да мы не прицепились, просто до меня долго доходит. Я не претендую на правоту в спорах с программисами, я многого не знаю и пока у меня есть интерес мне пригодится любая "накрутка" (как механизм в детских игрушках, его надо время от времени подручивать чтобы он двигался)

2
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
01.01.2020, 18:18
Если честно, мне тож больше нравится вариант с меньшим потреблением памяти (пусть и несколько килобайт — это ничтожное количество), но всё таки sdasdaw прав. Лучше ведь, шоб программа быстрее работала и выполнялось меньше вычислений
0
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
01.01.2020, 19:28
Gungala, если меньше потребление памяти, тогда лучше использовать XOR

Bash
1
2
3
4
5
      PLUS, 10 run(s) took    0.932s tot,    0.093s avg,    0.082s min,    0.150s max
     MULTI, 10 run(s) took    0.846s tot,    0.085s avg,    0.080s min,    0.091s max
   PERCENT, 10 run(s) took    2.084s tot,    0.208s avg,    0.204s min,    0.214s max
     SHIFT, 10 run(s) took    0.824s tot,    0.082s avg,    0.079s min,    0.090s max
       XOR, 10 run(s) took    0.765s tot,    0.077s avg,    0.073s min,    0.086s max
Исходник
Java
1
2
3
int[] flaggers = new int[27];
 
for (int i = 0; i < source.length(); i++) flaggers[source.charAt(i) ^ 96]++;
Добавлено через 6 минут
Перегнал тесты с двух сторон, XOR все равно победитель

Bash
1
2
3
4
5
6
7
8
9
    NATIVE, 100 run(s) took    8.174s tot,    0.082s avg,    0.074s min,    0.135s max
     SHIFT, 100 run(s) took    8.077s tot,    0.081s avg,    0.079s min,    0.089s max
      PLUS, 100 run(s) took    8.370s tot,    0.084s avg,    0.081s min,    0.123s max
       XOR, 100 run(s) took    7.458s tot,    0.075s avg,    0.072s min,    0.086s max
 
       XOR, 100 run(s) took    7.570s tot,    0.076s avg,    0.072s min,    0.157s max
      PLUS, 100 run(s) took    8.236s tot,    0.082s avg,    0.081s min,    0.092s max
     SHIFT, 100 run(s) took    8.058s tot,    0.081s avg,    0.079s min,    0.089s max
    NATIVE, 100 run(s) took    8.091s tot,    0.081s avg,    0.075s min,    0.084s max
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
01.01.2020, 21:35
Внезапно от заказчика приходят новые требования - считать ae, oo, au и т.д. за одну букву (типа дифтонги). И вся затея с массивом оказывается бесполезной
1
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
01.01.2020, 21:36
Цитата Сообщение от xoraxax Посмотреть сообщение
оказывается бесполезной
неа, дальше идут хешкоды
1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
02.01.2020, 00:16
Цитата Сообщение от sdasdaw Посмотреть сообщение
неа, дальше идут хешкоды
так может сразу надо hashMap взять?
0
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
02.01.2020, 00:45
xoraxax, можно
0
Заблокирован
03.01.2020, 10:02  [ТС]
I have a text, let's say: fyvfyv yvfvaavv (in practice, there will be 200 characters).
I need to display in alphabetical order the number of each character.
What approximately algorithm can this be done?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
03.01.2020, 12:35
Как вариант (без алфавитного порядка, зато частоты всех букв и задаваемых контекстов):

Java
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
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
     Map<String, Integer> hashMap = new HashMap<>();
     String letters  = "йцукенгшщзхъфывапролджэячсмитьбю";
     String [] words = {"аб", "бра", "брак","ра"};
     String text     = "абракадабра";
     String k,tmp;
     char a;
     int i,ltext,lw,n;
     for (i=0; i<text.length(); i++)
     {
        k=""+text.charAt(i);
        if (hashMap.get(k)==null)
        {
           hashMap.put(k,1);
        }
        else
        {
           hashMap.put(k,1+hashMap.get(k));
        }
     }
     ltext=text.length();
     for (i=0; i<words.length; i++)
     {
       lw=words[i].length();
       tmp=text.replace(words[i],"");
       n=(ltext-tmp.length())/lw;
       hashMap.put(words[i],n);             
     }
     System.out.println(hashMap);
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.01.2020, 12:35
Помогаю со студенческими работами здесь

Определить количество повторений в тексте заданного слова. Считать, что слова в тексте отделены друг от друга
1)В строке удалить введённое буквосочетание. 2)Определить количество повторений в тексте заданного слова. Считать, что слова в тексте...

Частота слов в тексте
с файлом сам разберусь, как реализовать алгоритм?

Частота появления биграмм в тексте
Доброго времени суток Искала по форуму похожую проблему -не нашла. Задание такое, нужно посчитать частоту вхождения каждой монограммы и...

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

Частота повторения слов в тексте
Привет всем Помогите пожалуйста с Си: Разработать программу, подсчитывающую частоту повторения в тексте слов и печатающую слова в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru