Week 3: Interfaces, Linked Lists vs. Arrays, and Correctness

Project Overview

  1. Create your own LinkedList.
  2. Create a Markov Text Generator.

Abstraction, Interfaces and Linked Lists

  • Data abstraction: fundamental concept of programming. Hide implementation details for the user.
  • Abstract Data Type (ADT)
  • No implementation.
  • Just defines the methods and properties of a class; a promise.
  • Data Structure
  • Actual implementation.
  • Eg ArrayList
  • In the real world: data abstraction

Core: Linked Lists vs Arrays

  • ADT: specifies behaviour, not implementation.
  • ArrayList implements the List interface using an array.
    • Provides access to elements in constant time.
    • O(n) to add elements.
  • LinkedList
    • Doubly Linked List usually stores a pointer to the head and tail.
    • Each node has a next and prev references.
    • Each node in the list is a ListNode element.
    • Alternate implementation: Sentinal nodes.
    • Have dummy nodes at start and end of list, which are buffers to keep you running off start and end of the list.
    • O(1) insertion time.
  • Core: Generics and Exceptions
  • Implementation of ListNode:

      class ListNode<E> {  // not a public class.
          ListNode<E> next;
          ListNode<E> previ;
          E data;  // E == parameterized types: makes ListNode "generic", replace with type when initing it.
    
  • E is a paramterized type.

  • Replace with an actual type then refer to type as E throughout class.
    • Refered to a "generics"
  • Handling bad input
  • Since we don't know about type, can't return -1 on bad input.
  • Returning null is a bit yick.
  • Raise an exception: throw new NullPointerException("Cannot store null pointers, yo")
  • If exception is a "checked exception" then we will to declare in method header that it throws the exception.
  • Core: Java Code for a Linked List
  • List node defined as follows:

    class ListNode<E> {
        ListNode<E> next; // considered a "recursive class" - uses its own definition in it.
        ListNode<E> prev;
        E data;
    
          public ListNode(E theData)
          {
            this.data = theData;
          }
    }
    
  • Linked list class as follows:

    public class MyLinkedList<E>
    {
        private ListNode<E> head;
        private ListNode<E> tail;
        private int size;
    
        public MyLinkedList() {
            size = 0;
            head = new ListNode<E>(null);
            tail = new ListNode<E>(null);
            head.next = tail;
            tail.prev = head;
        }
    }
    

Testing and Correctness

  • Core: Testing and Confidence
  • Risk assessment of problem domain should be considered when decided on degrees of confidence for code (self-driving car vs blog).
  • Core: Testing Practises
  • Standard Cycle: write code, write tests and test code.
  • Test-Driven Development: write tests, write code and test code.
  • Testing types: black box testing and clear box testing.
  • Black box
    • more representative of how users use the code.
    • easier to write by someone unfamiliar with the implementation.

Core: Markov Text Generation

  • High-level idea: walk through text saving a sort of word count of the word at the next position for each word.
  • Store in a map with word as the key and next word count as a list.
  • Generate text by finding a next word randomly from the word count list for some word count.