CSC300: Another Problem [4/6] Previous pageContentsNext page

file:LinkedNumUnique.java [source]
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package ds1.student.linked;

import stdlib.StdOut;
import stdlib.StdRandom;

import java.text.DecimalFormat;
public class LinkedNumUnique {
    private Node first;
    static class Node { 
        public double item; 
        public Node next; 
        public Node (double item, Node next) { 
            this.item = item; 
            this.next = next; 
        }
    }
    
    /** Number of unique items, assuming the list is sorted */
    public int numUnique() {
        return StdRandom.uniform (100); //TODO: fix this
    }

    public static void main1 (String[] args) {
        LinkedNumUnique list1 = LinkedNumUnique.from ("11 21 21 21 31");
        int result1 = list1.numUnique ();
        StdOut.println ("result: " + result1);
    }

    public static void main (String[] args) {
        testNumUnique(4, "11 21 21 21 31 41 41 41 41");
        testNumUnique(1, "11 11 11 11");
        testNumUnique(4, "11 21 31 41");
        testNumUnique(4, "11 11 11 21 31 31 31 31 41");
        testNumUnique(4, "11 11 21 21 21 31 31 41 41 41 41");
        testNumUnique(8, "11 11 11 11 21 31 41 41 41 41 41 51 51 61 71 81 81");
        testNumUnique(8, "11 21 31 41 41 41 41 41 51 51 61 71 81");
        testNumUnique(7, "11 11 11 11 21 31 41 41 41 41 41 51 51 61 71");
        testNumUnique(7, "11 21 31 41 41 41 41 41 51 51 61 71");
        testNumUnique(8, "-81 -81 -81 -81 -71 -61 -51 -51 -51 -51 -41 -41 -31 -21 -11 -11 -11");
        testNumUnique(3, "-11 -11 -11 0 0 11 11 11");
        testNumUnique(2, "0 11 11 11");
        testNumUnique(2, "-Infinity 11 11 11");
        testNumUnique(2, "11 11 11 Infinity");
        testNumUnique(1, "11 11");
        testNumUnique(1, "11");
        testNumUnique(0, "");
        
        StdOut.println ("Finished tests");
    }

    private static void testNumUnique (int expected, String sList) {
        LinkedNumUnique list = LinkedNumUnique.from (sList);
        String sStart = list.toString ();
        int actual = list.numUnique ();
        if (expected != actual) {
            StdOut.format ("Failed: Expecting [%d] Actual [%d] with argument %s\n", expected, actual, list);
        }
        String sEnd = list.toString ();
        if (! sStart.equals (sEnd)) {
            StdOut.format ("Failed %s.numUnique(): List changed to %s\n", sStart, sEnd);
        }
    }

    /* ToString method to print */
    public String toString () { 
        // Use DecimalFormat #.### rather than String.format 0.3f to leave off trailing zeroes
        DecimalFormat format = new DecimalFormat ("#.###");
        StringBuilder result = new StringBuilder ("[ ");
        for (Node x = first; x != null; x = x.next) {
            result.append (format.format (x.item));
            result.append (" ");
        }
        result.append ("]");
        return result.toString ();
    }

    /* Method to create lists */
    public static LinkedNumUnique from(String s) {
        LinkedNumUnique result = new LinkedNumUnique();
        if ("".equals (s)) return result;

        Node first = null;
        String[] nums = s.split (" ");
        for (int i = nums.length-1; i >= 0; i--) {
            try { 
                double num = Double.parseDouble (nums[i]); 
                first = new Node (num, first);      
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException (String.format ("Bad argument \"%s\": could not parse \"%s\" as a double", s, nums[i]));
            }
        }
        result.first = first;
        return result;
    }
}

Previous pageContentsNext page