Java程序辅导

C C++ Java Python Processing编程在线培训 程序编写 软件开发 视频讲解

客服在线QQ:2653320439 微信:ittutor Email:itutor@qq.com
wx: cjtutor
QQ: 2653320439
Assignment 8: Mutation and ArrayLists ► Fundamentals II Introduction to Class-based Program Design General Texts Lectures Syllabus Lab Materials Assignments Pair Programming Overview Code style Documentation ▼ Assignments Assignment 1: Designing complex data Assignment 2: Designing methods for complex data Assignment 3: Designing methods for Complex Data, Practice with Lists and Trees, Drawing Assignment 4: Abstraction; Constructors Assignment 5: A Game Assignment 6: Generic data, function objects Assignment 7: Visitors and Mutation Assignment 8: Mutation and Array  Lists Assignment 9: Flood It ► Assignment 8: Mutation and Array  Lists Instructions Problem 1:  Who’s On Deque? Problem 2:  Secret Code On this page: Instructions Problem 1: Who’s On Deque? 8.1 Data definitions and examples 8.2 Methods Problem 2: Secret Code 7.7     ← prev  up  next →  Assignment 8: Mutation and ArrayLists Goals:Design a double-ended queue, or deque (pronounced "deck"); Use ArrayLists and loops to solve interesting problems Instructions As always, be very careful with your naming conventions. The submissions will be organized as follows: Submission Homework 8 Problem 1: The Deque.java file with all its classes, interfaces, methods and tests. Submission Homework 8 Problem 2: The Permutation.java file with all its classes, interfaces, methods and tests. Problem 1: Who’s On Deque? We would like to build a generic list in such a way that we can start either at the front, or at the back, and move through the list in either direction. Here is an example of such a list (shown here with Strings), drawn as an object diagram: +---------------+ | Deque | +---------------+ | header ----------+ +---------------+ | +--------------+ | v +------------------+ +---------->| Sentinel |<-------------------------------------------+ | +------------------+ | | +---- next | | | | | prev ------------------------------------------------+ | | | +------------------+ | | | | | | | v v | | +--------------+ +--------------+ +--------------+ +--------------+ | | | Node | | Node | | Node | | Node | | | +--------------+ +--------------+ +--------------+ +--------------+ | | | "abc" | | "bcd" | | "cde" | | "def" | | | | next ----------->| next ----------->| next ----------->| next ----------+ +-- prev |<--- prev |<--- prev |<--- prev | +--------------+ +--------------+ +--------------+ +--------------+ Every Deque has a header that consists of the Sentinel node. This header field does not change, but the fields within the Sentinel node (that provide the links to the first and the last item in the Deque) can and will change. Each data Node has two links, one to the next item in the list and one to the previous item in the list. The Sentinel node is always present. It also has next and prev fields, which are consistently updated to link to the head of the list and to the tail of the list, respectively. The Sentinel and Node classes both inherit from a common superclass (shown below), because the next or prev item after any given node may be either a data-carrying Node or the Sentinel marking the end of the list. The list shown above has four data-carrying nodes and the lone sentinel. The empty list has just the Sentinel, and its links to the first and to the last item just reference the Sentinel node itself. So an empty list would have the following object diagram: +---------------+ | Deque | +---------------+ | header ---------+ +---------------+ | | +--------+ +----+ | +----+ | | | | | | V V V | | +------------------+ | | | Sentinel | | | +------------------+ | +--- next | | | prev ---------------+ +------------------+ The class diagram for these classes is as follows: +--------------------+ | Deque | +--------------------+ | Sentinel header |-+ +--------------------+ | | +--------------------------+ | | | +---------------+ | | ANode | | +---------------+ | | ANode next | | | ANode prev | | +---------------+ | /_\ /_\ | | | | +----+ | V | | +-------------+ +---------+ | Sentinel | | Node | +-------------+ +---------+ +-------------+ | T data | +---------+ We have an abstract class ANode, which can be either a Sentinel node or an actual Node containing data. We use an abstract class here instead of an interface because we need to share the next and prev fields. Moreover, because all ANodes are contained and hidden within the Deque, no external code needs to know about it: they are implementation details rather than a publicly visibly datatype definition. 8.1 Data definitions and examples Define the classes ANode, Node, Sentinel, and Deque. For Sentinel, define a constructor that takes zero arguments, and initializes the next and prev fields of the Sentinel to the Sentinel itself. For Node, define two constructors: the first one takes just a value of type T, initializes the data field, and then initializes next and prev to null. The second convenience constructor should take a value of type T and two ANode nodes, initialize the data field to the given value, initialize the next and prev fields to the given nodes, and also update the given nodes to refer back to this node. Throw an IllegalArgumentException in this constructor if either of the given nodes is null. (You can use if (theNode == null) { ... } to test for null-ness.) Note carefully the order of the arguments in this constructor! The order should match the class diagram above; getting the order wrong will result in oddly “backwards” lists. For Deque, define two constructors: one which takes zero arguments and initializes the header to a new Sentinel, and another convenience constructor which takes a particular Sentinel value to use. Make examples of three lists: the empty list, a list of Strings with the values ("abc", "bcd", "cde", and "def") shown in the drawing at the beginning of this problem, and a list with (at least) four values that are not ordered lexicographically. (Hint: If you’ve defined your constructors correctly, you shouldn’t need to use any explicit assignment statements in your examples class!) (Make more examples as needed to test the methods you define.) Name your examples class ExamplesDeque, and your first three examples deque1, deque2 and deque3. 8.2 Methods Design the method size that counts the number of nodes in a list Deque, not including the header node. (I.e., just count the Nodes and not the Sentinel.) Design the method addAtHead for the class Deque that consumes a value of type T and inserts it at the front of the list. Be sure to fix up all the links correctly! Design the method addAtTail for the class Deque that consumes a value of type T and inserts it at the tail of this list. Again, be sure to fix up all the links correctly! Design the method removeFromHead for the class Deque that removes the first node from this Deque. Throw a RuntimeException if an attempt is made to remove from an empty list. Be sure to fix up all the links correctly! As with ArrayList’s remove method, return the item that’s been removed from the list. Design the method removeFromTail for the class Deque that removes the last node from this Deque, analogous to removeFromHead above. Again, be sure to fix up all the links correctly! You probably have duplicate code in addAtHead, addAtTail, removeFromHead and removeFromTail. Revise your code to abstract out any duplication into helper methods — most likely, helper methods on ANode and its subclasses. Design the method find for the class Deque that takes an Predicate and produces the first node in this Deque for which the given predicate returns true. If the predicate never returns true for any value in the Deque, then the find method should return the header node in this Deque. (Hint: think carefully about the return type for find!) Design the method removeNode for the class Deque that removes the given node from this Deque. (Unlike removeFromHead or removeFromTail, this method does not need to return anything. Why?) If the given node is the Sentinel header, the method does nothing. (Hint: think again about the return type from find!) If you’ve revised your code to remove duplication as suggested above, this method should be very short and simple to implement. Problem 2: Secret Code Related files:   PermutationCode.java   Your goal is to write a program that will encode and decode secret messages using a simple mapping of letters to a permutation of all letters. So if our alphabet had only five letters (a, b, c, d, and e) we could choose to encode them as (b, e, a, c, and d). Then the received message abeedc would be decoded as cabbed and the message badace would be sent encoded as ebcbad. Download the file PermutationCode.java. It is a skeleton for your program. Your job is to design the three methods for which the purpose statements and the headers are already provided. You may need additional helper methods. For all methods, you are expected to follow the design recipe. The class PermutationCode contains the key for the encoding and decoding of the messages, as well as the methods that perform these tasks. There are two constructors. One allows you to specify explicitly what will be your encoding permutation. This allows you to test your methods that encode and decode the messages. The second constructor generates a new encoding permutation that may be given to the parties that wish to communicate in secret; you may assume the list given to this constructor will always be a proper permutation of the alphabet field. Design the method decode that will consume the encoded message and use the ArrayList code to decipher the message, one character at a time. Look up methods you may use with the data of the type String in the Java documentation. You may assume all the characters in the string can be found in the alphabet field (and therefore, the code field as well). Design the method encode that will consume the message we wish to encode and use the ArrayList code to produce the encoded message, — again — one character at a time. You may assume all the characters in the string can be found in the alphabet field (and therefore, the code field as well). Design the method initEncoder that produces a random permutation of the 26 letters of the alphabet and returns it as an ArrayList of Characters. Hint: Make a copy of the alphabet list, then remove one character at random and add it to the encoder list, until all letters have been consumed. Be sure to abstract if and when appropriate.     ← prev  up  next →