Przeglądaj źródła

Add linked-list exercise

The tests assume that the Deque class is implemented with generics.

The example implementation keeps track of a circular head Element.

Completes one task in https://github.com/exercism/xjava/issues/3.
Brian Mathiyakom 10 lat temu
rodzic
commit
517504f0bb

+ 1
- 0
config.json Wyświetl plik

@@ -37,6 +37,7 @@
37 37
     "octal",
38 38
     "luhn",
39 39
     "pig-latin",
40
+    "linked-list",
40 41
     "pascals-triangle"
41 42
   ],
42 43
   "deprecated": [

+ 12
- 0
linked-list/build.gradle Wyświetl plik

@@ -0,0 +1,12 @@
1
+apply plugin: "java"
2
+apply plugin: "eclipse"
3
+apply plugin: "idea"
4
+
5
+repositories {
6
+  mavenCentral()
7
+}
8
+
9
+dependencies {
10
+  testCompile "junit:junit:4.10"
11
+  testCompile "org.assertj:assertj-core:3.2.0"
12
+}

+ 0
- 0
linked-list/src/example/java/.keep Wyświetl plik


+ 45
- 0
linked-list/src/example/java/Deque.java Wyświetl plik

@@ -0,0 +1,45 @@
1
+public final class Deque<T> {
2
+    private Element head;
3
+
4
+    public void push(T value) {
5
+        if (head == null) {
6
+            head = new Element(value, null, null);
7
+            head.setNext(head);
8
+            head.setPrev(head);
9
+            return;
10
+        }
11
+
12
+        Element oldTail = head.getPrev();
13
+        Element tail = new Element(value, oldTail, head);
14
+        oldTail.setNext(tail);
15
+        head.setPrev(tail);
16
+    }
17
+
18
+    public T pop() {
19
+        head = head.getPrev();
20
+        return shift();
21
+    }
22
+
23
+    public void unshift(T value) {
24
+        push(value);
25
+        head = head.getPrev();
26
+    }
27
+
28
+    public T shift() {
29
+        Object value = head.getValue();
30
+
31
+        Element newHead = head.getNext();
32
+        Element newTail = head.getPrev();
33
+
34
+        if (newHead == head) {
35
+            head = null;
36
+        }
37
+        else {
38
+            newHead.setPrev(newTail);
39
+            newTail.setNext(newHead);
40
+            head = newHead;
41
+        }
42
+
43
+        return (T) value;
44
+    }
45
+}

+ 52
- 0
linked-list/src/example/java/Element.java Wyświetl plik

@@ -0,0 +1,52 @@
1
+public final class Element {
2
+    private final Object value;
3
+    private Element prev;
4
+    private Element next;
5
+
6
+    public Element(Object value, Element prev, Element next) {
7
+        this.value = value;
8
+        this.prev = prev;
9
+        this.next = next;
10
+    }
11
+
12
+    public Element getPrev() {
13
+        return prev;
14
+    }
15
+
16
+    public void setPrev(Element prev) {
17
+        this.prev = prev;
18
+    }
19
+
20
+    public Element getNext() {
21
+        return next;
22
+    }
23
+
24
+    public void setNext(Element next) {
25
+        this.next = next;
26
+    }
27
+
28
+    public Object getValue() {
29
+        return value;
30
+    }
31
+
32
+    @Override
33
+    public boolean equals(Object o) {
34
+        if (this == o) return true;
35
+        if (o == null || getClass() != o.getClass()) return false;
36
+
37
+        Element element = (Element) o;
38
+
39
+        if (value != null ? !value.equals(element.value) : element.value != null) return false;
40
+        if (prev != null ? !prev.equals(element.prev) : element.prev != null) return false;
41
+        return next != null ? next.equals(element.next) : element.next == null;
42
+
43
+    }
44
+
45
+    @Override
46
+    public int hashCode() {
47
+        int result = value != null ? value.hashCode() : 0;
48
+        result = 31 * result + (prev != null ? prev.hashCode() : 0);
49
+        result = 31 * result + (next != null ? next.hashCode() : 0);
50
+        return result;
51
+    }
52
+}

+ 0
- 0
linked-list/src/main/java/.keep Wyświetl plik


+ 0
- 0
linked-list/src/test/java/.keep Wyświetl plik


+ 61
- 0
linked-list/src/test/java/DequeTest.java Wyświetl plik

@@ -0,0 +1,61 @@
1
+import org.junit.Before;
2
+import org.junit.Test;
3
+
4
+import static org.assertj.core.api.Assertions.assertThat;
5
+
6
+public class DequeTest {
7
+    private Deque<Integer> subject;
8
+
9
+    @Before
10
+    public void setUp() {
11
+        subject = new Deque<>();
12
+    }
13
+
14
+    @Test
15
+    public void testPushPop() {
16
+        subject.push(10);
17
+        subject.push(20);
18
+        assertThat(subject.pop()).isEqualTo(20);
19
+        assertThat(subject.pop()).isEqualTo(10);
20
+    }
21
+
22
+    @Test
23
+    public void testPushShift() {
24
+        subject.push(10);
25
+        subject.push(20);
26
+        assertThat(subject.shift()).isEqualTo(10);
27
+        assertThat(subject.shift()).isEqualTo(20);
28
+    }
29
+
30
+    @Test
31
+    public void testUnshiftShift() {
32
+        subject.unshift(10);
33
+        subject.unshift(20);
34
+        assertThat(subject.shift()).isEqualTo(20);
35
+        assertThat(subject.shift()).isEqualTo(10);
36
+    }
37
+
38
+    @Test
39
+    public void testUnshiftPop() {
40
+        subject.unshift(10);
41
+        subject.unshift(20);
42
+        assertThat(subject.pop()).isEqualTo(10);
43
+        assertThat(subject.pop()).isEqualTo(20);
44
+    }
45
+
46
+    @Test
47
+    public void testExample() {
48
+        subject.push(10);
49
+        subject.push(20);
50
+        assertThat(subject.pop()).isEqualTo(20);
51
+
52
+        subject.push(30);
53
+        assertThat(subject.shift()).isEqualTo(10);
54
+
55
+        subject.unshift(40);
56
+        subject.push(50);
57
+        assertThat(subject.shift()).isEqualTo(40);
58
+        assertThat(subject.pop()).isEqualTo(50);
59
+        assertThat(subject.shift()).isEqualTo(30);
60
+    }
61
+}