Z OLD Tutorial 04 - james-bern/CS136 GitHub Wiki

Problems

Implement an array list from scratch.

import java.util.*;

class Tut04ArrayList {  

    private String[] privateArray; 
    private int numberOfElementsActuallyStoredInPrivateArray; // NOTE: Feel free to rename.

    public int size() {
        return numberOfElementsActuallyStoredInPrivateArray;
    };


    Tut04ArrayList() {
        // TODO: construct new array list with starting capacity of 1
    }

    String get(int index) {
        // TODO: get element at given index
        return null;
    }

    void add(String element) {
        // TODO: append element to the back of the list

    }

    void add(int index, String element) {
        // TODO: insert element so it has given index in the list
    } 

    void remove(int index) {
        // TODO: remove element at given index
    }


    // special function called automatically by System.out.println
    // NOTE: unlike the toString() function in Java's ArrayList<ElementType>,
    //       this function prints the empty slots (null's)
    //       so you can see what's happening under the hood
    public String toString() {
        return Arrays.toString(privateArray);
    }

    public static void main(String[] arguments) {
        Tut04ArrayList list = new Tut04ArrayList();
        System.out.println(list); // [null]
        list.add("Hello");
        System.out.println(list); // [Hello]
        list.add("World");
        System.out.println(list); // [Hello, World]
        list.add(1, "Cruel");
        System.out.println(list); // [Hello, Cruel, World, null]
        list.remove(0);
        System.out.println(list.size()); // 2
        System.out.println(list); // [Cruel, World, null, null]
                                  // NOTE: [Cruel, World, World, null] also okay if size() was 2
    }
} 

Use your array list.

Give your array list a new function called void repeatElements(int numRepeats); If list currently contains elements ["Blango", "Sproot", "Sparket"], calling list.repeatElements(3) should cause it to contain ["Blango", "Blango", "Blango", "Sproot", "Sproot", "Sproot", "Sparket", "Sparket", "Sparket"].

Try to solve this problem using only get(...), size(...) and add(...) from the previous part.

Solutions

import java.util.*;

class Tut04ArrayList {  
    private String[] privateArray; 
    private int numberOfElementsActuallyStoredInPrivateArray; // NOTE: Feel free to rename.

    public int size() {
        return numberOfElementsActuallyStoredInPrivateArray;
    };


    Tut04ArrayList() {
        privateArray = new String[1];

        // NOTE: This line is technically optional because objects are automatically zero-initialized in Java.
        numberOfElementsActuallyStoredInPrivateArray = 0;
    }

    String get(int index) {
        return privateArray[index];
    }

    void add(String element) {
        add(numberOfElementsActuallyStoredInPrivateArray, element);
    }

    void add(int index, String element) {
        if (numberOfElementsActuallyStoredInPrivateArray == privateArray.length) {
            String[] newPrivateArray = new String[2 * privateArray.length];
            for (int i = 0; i < privateArray.length; ++i) {
                newPrivateArray[i] = privateArray[i];
            }
            privateArray = newPrivateArray;
        }
        for (int i = numberOfElementsActuallyStoredInPrivateArray - 1; i >= index; --i) {
            privateArray[i + 1] = privateArray[i];
        }
        privateArray[index] = element;
        numberOfElementsActuallyStoredInPrivateArray++;
    } 

    void remove(int index) {
        for (int i = index; i < numberOfElementsActuallyStoredInPrivateArray - 1; ++i) {
            privateArray[i] = privateArray[i + 1];
        }
        --numberOfElementsActuallyStoredInPrivateArray;

        // NOTE: This line is optional; sets the newly-empty slot to null
        privateArray[numberOfElementsActuallyStoredInPrivateArray] = null;
    }

    void repeatElements(int numRepeats) {
        // NOTE: This is NOT a good algorithm for solving this problem (though it does work correctly).
        // We will discuss in class :)
        // FORNOW: Think about what it actually does under the 
        int numBefore = size();
        for (int i = 0; i < numBefore; ++i) {
            for (int repetition = 0; repetition < (numRepeats - 1); ++repetition) {
                int index = i * numRepeats;
                add(index, get(index));
            }
        }
    }

    // special function called automatically by System.out.println
    // prints the empty slots (null's) so you can see what's actually happening
    public String toString() {
        return Arrays.toString(privateArray);
    }

    public static void main(String[] arguments) {
        {
            Tut04ArrayList list = new Tut04ArrayList();
            System.out.println(list); // [null]
            list.add("Hello");
            System.out.println(list); // [Hello]
            list.add("World");
            System.out.println(list); // [Hello, World]
            list.add(1, "Cruel");
            System.out.println(list); // [Hello, Cruel, World, null]
            list.remove(0);
            System.out.println(list.size()); // 2
            System.out.println(list); // [Cruel, World, null, null]
                                      // NOTE: [Cruel, World, World, null] also okay if size() was 2
        }
        {
            Tut04 list = new Tut04();
            list.add("Blango");
            list.add("Sproot");
            list.add("Sparket");
            System.out.println(list);
            list.repeatElements(3);
            System.out.println(list);
        }
    }
}