Оценивание: задача 1: стандартная задача, 20 баллов, задача 2: творческая задача, 30 баллов.
Вершину иерархической пирамиды Java Collections Framework составляют два интерфейса. Понятное дело, один из них это Collections. Второй интерфейс — Map (Отображение) — является предметом рассмотрения в этом задании.
Начать выполнение задания следует со знакомства с интерфейсом Map по документации.
Вначале обратим внимание на общую концепцию Map — предоставить общий подход к работе с хранилищами пар «ключ» => «значение». Т.е. Map
Выделим методы, с которыми необходимо разобраться в первую очередь:
1 2 3 4 5 6 |
boolean containsKey(Object key) // есть ли такой ключ (в "области определения"). boolean containsValue(Object value) // есть ли такое значение (в "области значений"). V get(Object key) // возвращает значение соответствующее указанному ключу, null если такого ключа нет. Set<K> keySet() // строит "область определения" как множество ключей. Collection<V> values() // строит "область значений" как множество значений. Set<Map.Entry<K,V>> entrySet() // строит множество (Set) пар ключ-значение. Как бы создаёт множество из отображения (может понадобиться?). |
Не все реализации интерфейса допускают динамическое изменение отображения. Поэтому соответствующие функции являются опциональными:
1 2 3 |
V put(K key, V value) // связывает заданное значение с ключом (необязательная операция). void putAll(Map<? extends K,? extends V> m) // копирует пары ключ-значение из одного отображения в другое (необязательная операция). V remove(Object key) // удаляет ключ и связанное с ним значение (необязательная операция). |
И ещё одна группа функций назначение которых и так понятно:
1 2 3 4 5 |
int size() // Returns the number of key-value mappings in this map. void clear() // Removes all of the mappings from this map (optional operation). boolean isEmpty() // Returns true if this map contains no key-value mappings. boolean equals(Object o) // Compares the specified object with this map for equality. int hashCode() // Returns the hash code value for this map. |
Далее рассмотрим две задачи:
Задача 1. Получив на входе корпус языка (огромный набор атрибутированных текстов на каком-нибудь языке) построить частотный словарь. Знаки препинания, скобки, кавычки и числа должны быть удалены. Слова, содержащие в себе не буквенные символы, игнорируются целиком.
Задача 2. При автоматическом переводе необходимо из нескольких слов выбрать наиболее употребительное. Необходимо построить эффективную реализацию функции, которая для данного множества (Set) слов-ключей, определит то, которому соответствует максимальное значение.
Вам необходимо выбрать для каждой из задач наиболее эффективную реализацию интерфейса Map из имеющихся: Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap.
Если появится необходимость сделать свою реализацию, рассмотрите класс AbstractMap как заготовку.
И, конечно, нужно решить и протестировать решения обоих задач.
Задача 2 для групп Антоненко А.С.. Пусть задано некоторое число [latex]N[/latex]. Определить [latex]N[/latex] самых частых слов и их частоты (в процентном отношении от максимального количества слов). Рассмотрите два варианта этого задания: первый из них попроще — пусть вначале формируется частотный словарь, а уже потом рассчитывается статистика (перечень самых частных слов). Второй вариант соответствует случаю, когда в процессе подсчета нужно динамически обновлять статистику (при этом число [latex]N[/latex] относительно невелико, а количество запросов на выдачу самых частых на данный момент строк сопоставимо с количеством слов).