Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Упражнения

Читайте также:
  1. Артикуляционные упражнения для растягивания уздечки языка
  2. Базовые упражнения на меткость
  3. Базовые упражнения на меткость
  4. БЕЗОПАСНЫЕ И УДОБНЫЕ УПРАЖНЕНИЯ ВО ВРЕМЯ ГРУДНОГО ВСКАРМЛИВАНИЯ
  5. Благочестивые упражнения во время молитвы и расслабления духовного.
  6. Глава 18. УПРАЖНЕНИЯ ПО ПОВЫШЕНИЮ УВЕРЕННОСТИ В СЕБЕ
  7. Дыхательные Упражнения Вазы
  8. Задачи и упражнения
  9. Занятие 10. Одноатомные спирты. Тест по теме «Одноатомные спирты». Задачи и упражнения на одноатомные спирты.
  10. Звуковые упражнения

Решения для выбранных упражнений могут быть найдены в электронной документации " The Thinking in Java Annotated Solution Guide ", доступной за малую плату на www.BruceEckel.com.

  1. Создайте массив double и заполните его (fill()), используя RandDoubleGenerator. Результат напечатайте.
  2. Создайте новый класс, называемый Gerbil с полем int gerbilNumber, которое инициализируется конструктором (аналогично примеру Mouse в этой главе). Создайте метод, называемый hop(), который печатает номер и какое это обращение. Создайте ArrayList и добавьте группу объектов Gerbil в List. Теперь, используйте метод get() для прохода по списку и вызова hop() для каждого Gerbil.
  3. Измените Упражнение 2 так, чтобы вы использовали Iterator для обхода List и вызова hop().
  4. Возьмите класс Gerbil из Упражнения 2 и поместите его в Map, ассоциируя имя каждого Gerbil, как строку (ключ) для каждого Gerbil (значение), поместите их в таблицу. Получите Iterator для keySet() и используйте его для прохода Map, поиска Gerbil для каждого ключа и печать ключа и вызова hop() для Gerbil.
  5. Создайте List (попробуйте и ArrayList, и LinkedList) и заполните их, используя Collections2.countries. Отсортируйте список и напечатайте его, затем примените Collections.shuffle() к списку несколько раз, печатайте каждый раз, чтобы увидеть, как вызовы метода shuffle() смешивает список по новому каждый раз.
  6. Продемонстрируйте, что вы не можете ничего добавить в MouseList, кроме Mouse.
  7. Измените MouseList.java так, чтобы он наследовался от ArrayList вместо использования композиции. Покажите проблему, которая при этом возникает.
  8. Восстановите CatsAndDogs.java, создав контейнер Cats (использующий ArrayList), который принимает и возвращает только объекты Cat.
  9. Создайте контейнер, который инкапсулирует массив String, и который добавляет только String, и возвращает только String, так чтобы не нужно было приведение типов при использовании. Если ваш внутренний массив недостаточно велик для добавления следующего элемента, ваш контейнер автоматически мог бы изменять размер. В main() сравните производительность вашего контейнера и ArrayList, хранящего String.
  10. Повторите Упражнение 9 для контейнера int, и сравните с производительностью ArrayList, содержащим объекты Integer. В ваш процесс сравнения включите процесс инкрементирования каждого объекта контейнера.
  11. Использую утилиты com.bruceeckel.util, создайте массивы каждого из примитивных типов и String, затем заполните каждый, используя соответствующий генератор, и напечатайте каждый массив, используя соответствующий метод print().
  12. Создайте генератор, который производит символьные имена ваших любимых фильмов (вы можете использовать " Матрица " или " Звездные войны " для сигнализации), и зациклите его на начало, когда имена закончатся. Используйте утилиту в com.bruceeckel.util для заполнения массива, ArrayList, LinkedList и обоих типов Set, затем напечатайте каждый контейнер.
  13. Создайте класс, содержащий два объекта String, и сделайте его Comparable, так чтобы сравнение происходило только по первым String. Заполните все массивы и ArrayList объектами вашего класса, используя генератор geography. Продемонстрируйте, что сортировка работает правильно. Теперь создайте Comparator, который заботится только о вторых String и продемонстрируйте, что сортировка работает правильно; также выполните бинарный поиск, используя ваш Comparator.
  14. Измените Упражнение 13 так, чтобы использовалась алфавитная сортировка.
  15. Используйте Arrays2.RandStringGenerator для заполнения TreeSet, но используйте алфавитный порядок. Напечатайте TreeSet для проверки порядка сортировки.
  16. Создайте ArrayList и LinkedList, и заполните каждый из них, используя генератор Collections2.capitals. Напечатайте каждый список, используя обычный Iterator, затем вставьте один список в другой, используя ListIterator, вставьте в любое другое место. Теперь выполните вставление, начав с конца первого списка, перемещайтесь назад.
  17. Напишите метод, который использует Iterator для прохода по Collection и печатайте hashCode() каждого объекта контейнера. Заполните все остальные типы Collection объектами и примените ваш метод к каждому контейнеру.
  18. Повторите проблему из InfiniteRecursion.java.
  19. Создайте класс, затем создайте инициализированный массив объектов вашего класса. Заполните List из вашего массива. Создайте подмножество вашего List, используя subList(), а затем удалите подмножество из вашего List, используя removeAll().
  20. Измените Упражнение 6 в Главе 7, чтобы программа использовала ArrayList для хранения Rodent, и Iterator для перемещения по последовательности объектов Rodent. Помните, что ArrayList хранит только Object, поэтому вы должны выполнять приведение, когда получаете доступ к индивидуальному объекту Rodent.
  21. Следуя примеру Queue.java, создайте класс Deque и проверьте его.
  22. Используйте TreeMap в Statistics.java. Теперь добавьте код, который проверяет различия производительности HashMap и TreeMap в этой программе.
  23. Постройте Map и Set, содержащих все страны, начинающиеся с буквы ‘A’.
  24. Используя Collections2.countries, заполните Set несколько раз одними и теми же данными и проверьте, что Set содержит только одну копию. Попробуйте проделать это с обоими видами Set.
  25. Начиная с Statistics.java, создайте программу, которая несколько раз запускает тест и проверяет, что одни номера появляются в результате чаще других.
  26. Перепишите Statistics.java, используя HashSet объектов Counter (измените Counter так, чтобы он работал в HashSet). Какой подход кажется лучше?
  27. Измените класс из Упражнения 13 так, чтобы он работал с HashSet и как ключ с HashMap.
  28. Используя SlowMap.java для вдохновения, создайте SlowSet.
  29. Примените тесты в Map1.java к SlowMap для проверки его работы. Найдите что-нибудь в SlowMap, что не работает правильно.
  30. Реализуйте оставшуюся часть интерфейса Map для SlowMap.
  31. Измените MapPerformance.java для включения в проверку SlowMap.
  32. Измените SlowMap так, чтобы вместо двух ArrayList, он содержал один ArrayList из объектов MPair. Проверьте, что измененная версия работает правильно. Используя MapPerformance.java, проверьте скорость вашего нового объекта Map. Теперь измените метод put() так, чтобы он выполнял сортировку после введения каждой пары, и измените get(), чтобы он использовал Collections.binarySearch() для поиска ключа. Сравните производительность новой версии и старой.
  33. Добавьте поле char в CountedString, которое будет инициализироваться в конструкторе, и измените методы hashCode() и equals(), чтобы они включали значение этого char.
  34. Измените SimpleHashMap так, чтобы он сообщал о коллизиях, и проверьте это, добавив одни и те же данные дважды, чтобы вы могли вдеть коллизии.
  35. Измените SimpleHashMap так, чтобы он сообщал число необходимых “проб” при возникновении коллизий. То есть, сколько вызовов next() должно быть выполнено итератором для прохода по LinkedList и поиску совпадений?
  36. Реализуйте методы clear() и remove() для SimpleHashMap.
  37. Реализуйте оставшуюся часть интерфейса Map для SimpleHashMap.
  38. Добавьте метод private rehash() для SimpleHashMap, который вызывается, когда коэффициент загрузки превышает 0.75. Во время повторного хеширования удвойте число ковшей, затем выполните поиск первого простого числа большего, чем определенное новое число ковшей.
  39. Следуя примеру в SimpleHashMap.java, создайте и проверьте SimpleHashSet.
  40. Измените SimpleHashMap для использования ArrayList вместо LinkedList. Измените MapPerformance.java для сравнения производительности двух реализаций.
  41. Используя HTML документацию JDK (доступную на java.sun.com), найдите класс HashMap. Создайте HashMap, наполните ее элементами и определите коэффициент загрузки. Проверьте скорость поиска этой карты, затем попробуйте увеличить скорость, создав новый HashMap, с большей начальной емкостью, и скопируйте старую карту в новую, запустите ваш тест проверки скорости для новой карты.
  42. В Главе 8, найдите пример GreenhouseControls.java, который состоит из трех файлов. В Controller.java класс EventSet - это просто контейнер. Измените код на использование LinkedList вместо EventSet. Это потребует больше, чем простой замены EventSet на LinkedList; вы также должны использовать Iterator для прохода по множеству событий.
  43. (Сомнения). Напишите ваш собственный класс карты, подстроенный для определенного типа ключа: например, String. Не наследуйте его от Map. Вместо этого, дублируйте методы, чтобы методы put() и get() принимал только объекты String в качестве ключей, а не Object. Все, что затрагивает ключи, не должно использовать общий тип, а вместо этого работать со String, для предотвращения затрат на приведение и обратное приведение. Ваша цель в создании максимально быстрой реализации. Измените MapPerformance.java для проверки вашей реализации с HashMap.
  44. (Сомнения). Найдите исходный код для List в исходном коде библиотеки Java, которая поставляется со всеми дистрибутивами Java. Скопируйте этот код и сделайте специальную версию, назвав ее intList, которая содержит только int. Рассмотрите что нужно сделать для создания специальных версии списков для всех примитивных типов. Теперь рассмотрите что случится, если вы захотите создать связанный список, который работает со всеми примитивными типами. Если бы параметризованные типы уже были бы реализованы в Java, они обеспечивали бы способ выполнить эту работу за вас автоматически (как и многие другие полезные действия).

[44] Однако, можно спросить насколько велик vector, а метод at() выполняет проверку границ.

[45] Это одно из тех мест, где C++ явно превосходит Java, так как C++ поддерживает параметризированные типы с ключевым словом template.

[46] Программист C++ заметит, сколько много кода может уйти при использовании аргументов по умолчанию и шаблонов. Программист Python заметит, что вся эта библиотека могла быть излишне большой в этом языке.

[47] По словам Joshua Bloch из Sun.

[48] Эти данные были найдены в Internet, затем обработаны, путем создания программы на Python (смотрите www.Python.org).

[49] Это то место, где перегрузка операторов могла бы объявляться.

[50] Если эти ускорения производительности все еще не удовлетворяют ваши требования, вы можете еще ускорить поиск в таблице, написав свой собственный Map и настроив его под ваш определенный тип для предотвращения задержек на приведение типа от Object. Для получения еще большего уровня производительности, энтузиасты скорости могут использовать книгу Donald Knuth The Art of Computer Programming, Volume 3: Sorting and Searching, Second Edition для замены перегруженного списка ковшей на массив, который имеет два дополнительных полезных свойства: он может быть оптимизирован для хранения характеристик на диске и он может сохранить много времени при создании и сборке мусора индивидуальных записей.

 

 




Дата добавления: 2015-09-11; просмотров: 30 | Поможем написать вашу работу | Нарушение авторских прав

Функциональность Collection | Функциональность List | Функциональность Set | Функциональность Map | Хеширование и хеш-коды | Фактор производительности HashMap | Хранение ссылок | Выбор реализации | Неподдерживаемые операции | Vector и Enumeration |


lektsii.net - Лекции.Нет - 2014-2024 год. (0.008 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав