Объектно-ориентированный язык Java
Два конструктора Prefix создают новые экземпляры класса в зависимости от передаваемых параметров. В первом случае копируется существующее значение типа Prefix, а во втором префикс создается из п копий строки; этот конструктор используется для создания NPREF копий NONWORD при инициализации префикса:
Класс Prefix имеет также два метода, hashCode и equals, которые неявно вызываются из Hashtable для индексации и поиска по таблице. Нам пришлось сделать Prefix полноценным классом как раз из-за этих двух методов, которых требует Hashtable, иначе для него можно было бы использовать Vector, как мы сделали с суффиксом.
Метод hashCode создает отдельно взятое хэш-значение, комбинируя набор значений hashCode для элементов вектора:
Метод equals осуществляет поэлементное сравнение слов в двух префиксах:
Программа на Java гораздо меньше, чем ее аналог на С, при этом больше деталей проработано в самом языке – очевидными примерами являются классы Vector и Hashtable. В общем и целом управление хранением данных получилось более простым, поскольку вектора растут, когда нужно, а сборщик мусора (garbage collector – специальный автоматический механизм виртуальной машины Java) сам заботится об освобождении неиспользуемой памяти. Однако для того, чтобы использовать класс Hashtable, нам пришлось-таки самим писать функции hashCode и equals, так что нельзя сказать, что язык Java заботился бы обо всех деталях.
Сравнивая способы, которыми программы на С и Java представляют и обрабатывают одни и те же структуры данных, следует отметить, что в версии на Java лучше разделены функциональные обязанности. При таком подходе нам, например, не составит большого труда перейти от использования класса Vector к использованию массивов. В версии С каждый блок связан с другими блоками: хэш-таблица работает с массивами, которые обрабатываются в различных местах; функция lookup четко ориентирована на конкретное представление структур State и Suffix; размер массива префиксов вообще употребляется практически всюду.
Пропустив эту программу с исходным (химическим) текстом и форматируя сгенерированный текст с помощью процедуры fmt, мы получили следующее:
% Java Markov <j r^cheinistry .txt | fmt Wash the blackboard. Watch it dry. The water goes into the air. When water goes into the air it evaporates. Tie a damp clotTf to one end of a solid or liquid. Look around. What are the solid things? Chemical changes take place when something burns. If the burning material has.liquids, they are stable and the sponge rise. It looked like dough, but it is burning. Break up the lump of sugar into small pieces and put them together again in the bottom of a liquid.
Упражнение 3.4
Перепишите Java-версию markov так, чтобы использовать массив вместо класса Vector для префикса в классе Prefix.