Определение понятия «частотный словарь» можно посмотреть в Википедии.
Реализовывалось на своем АВЛ-дереве.
Сначала надо распарсить строку на слова, которые удовлетворяют условию задачи 1. Потому, надо с помощью структуры данных как map реализовать дерево, поддерживающее ключ -> значение структуру. АВЛ-дерево в каком-то роде схоже с map, так что можно использовать его. Правда оно не имплемирует ни одного интерфейса, которые имплемирует map. Разбив текст на слова и добавив их в дерево с количеством их вхождений мы можем вывести частоту каждого из них. Для хранения общего количества слов используется переменная внутри словаря. Библиотека имеет один метод для получения результата — это по заданному слову выдать частоту его вхождения. Если необходимо вывести все слова в словаре, то тогда можно расширить класс АВЛ-дерева.
#include <iostream> using namespace std;int main() {for( int i = 0; i < 10; i++ ) { if( i % 2 == 0 ) { cout << “Even” << endl; } else { cout << “Odd” << endl; } } return 0; }%EOF%
|
0 3 0.1111111111111111 10 1 0.037037037037037035 2 1 0.037037037037037035 Even 1 0.037037037037037035 Odd 1 0.037037037037037035 cout 2 0.07407407407407407 else 1 0.037037037037037035 endl 2 0.07407407407407407 for 1 0.037037037037037035 i 4 0.14814814814814814 if 1 0.037037037037037035 include 1 0.037037037037037035 int 2 0.07407407407407407 iostream 1 0.037037037037037035 main 1 0.037037037037037035 namespace 1 0.037037037037037035 return 1 0.037037037037037035 std 1 0.037037037037037035 using 1 0.037037037037037035 |
aaa for bbb aaa for if %EOF% |
aaa 2 0.3333333333333333 bbb 1 0.16666666666666666 for 2 0.3333333333333333 if 1 0.16666666666666666 |
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
import java.util.Scanner; import java.util.StringTokenizer; /** * Created by green on 20.12.15. */ class Vocabular{ private AVL<String, Statistic> voc; int gloablCount = 0; public class Statistic{ private int Count; private double Percent; Statistic(){ Count = 1; Percent = 0; } public int getCount(){ return Count; } public double getPercent(){ return Percent; } } public Vocabular(String text, String delimiters){ voc = new AVL(); StringTokenizer st = new StringTokenizer(text, delimiters); while (st.hasMoreTokens()){ String key = st.nextToken(); Statistic value = voc.get(key); if (null != value){ value.Count++; voc.add(key, value); }else{ value = new Statistic(); voc.add(key, value); } gloablCount++; } for(AVL<String, Statistic>.Node e = voc.getFirstNode(); e != null; e = e.next()){ e.value.Percent = (double)e.value.Count/gloablCount; } } public AVL<String, Statistic>.Node getFirstNode(){ return voc.getFirstNode(); } public double getValue(String key){ Statistic v = voc.get(key); if(v == null) return 0; else return v.Percent; } } public class Vocabulary { public static void main(String[] args){ String text = ""; Scanner in = new Scanner(System.in); for(;;){ if(!in.hasNextLine()) break; String inputLine = in.nextLine(); if(inputLine == null || inputLine.equals("%EOF%")) break; text = text + inputLine + "\n"; } in.close(); if(text.isEmpty()){ System.out.println("*** Empty text ****"); return; } Vocabular voc = new Vocabular(text, " ?.,;:-+\n\t{}[]=()<>*&%$#@\"\'“”`~!"); for(AVL<String, Vocabular.Statistic>.Node e = voc.getFirstNode(); e != null; e = e.next()){ System.out.println(e.key+" "+e.value.getCount()+" "+e.value.getPercent()); } } } |
Засчитано.